본문 바로가기

C# .Net

[EFC#] effective c# - 4. LINQ 활용 # 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다- 지연평가로 인해 파라미터의 유효성 확인이 늦어질 경우 다른 메소드에 유효성 확인 로직을 넣고, 통과하면 이터레이터를 리턴으로 호출하는 방식을 쓸 수 있다. # 루프보다 쿼리 구문이 낫다- 쿼리 구문을 사용하면 프로그램 논리를 명령형 방식에서 선언적인 방식으로 전환할 수 있다.- 이렇게 하면 한번의 순회 단계 내에서 여러 작업을 결합하여 단번에 수행할 수 있고- 원래의 의도도 더 명확하게 구현할 수 있다. # 시퀀스에 사용할 수 있는 조합가능한 API를 사용해라- yield return 문을 사용하면 시퀀스를 반환하는 메서드를 쉽게 만들 수 있다. - 이를 사용하면 매서드 내에서 시퀀스 내의 개별요소를 저장하기 위해 별도의 저장소를 마련할 필요가 ..
[EFC#] effective c# - 3. 제네릭 활용 # 반드시 필요한 제약조건만 설정하라 - 제너릭 타입을 활용할때 타입 조건을 넣고싶다면 제약조건 예약어 [where](parkdoyeon.github.io/study-log/2018-12-05-csharp-2.0-Generic)를 사용하는 것이 좋다 - 그러나 기본값을 할당하는데 있어서 default()와 new()는 분명한 차이가 있으므로, 제약조건에 new()를 넣을땐 이용자가 구현에 어려움을 겪을수도 있다는 것을 생각해야한다. # 런타입에 타입을 확인하여 최적의 알고리즘을 사용하라 - 제약조건을 사용하지 않고 제너릭 타입을 사용하게되면 런타임에 타입확인이 이뤄진다. - 이때, 런타임 환경을 최대한 고려하여 최적화된 타입별 생성자/메소드 오버로드등을 작성하는 것이 좋다. # IComparable와 I..
[EFC#] effective c# - 2. 리소스 관리 # .NET 리소스 관리의 이해 finalizer/IDisposable 1. 닷넷은 가비지 수집기가 있기 때문에 개발자가 메모리 해제/누수와 같은 문제를 직접적으로 처리할 필요가 없다. 2. 그러나 비관리 리소스의 경우 관리가 필요하며, 이를 위해 finalizer와 IDisposable 라는 두가지 메커니즘을 제공한다. 3. finalizer의 경우 가비지로 간주된 이후에도 메모리 점유시간이 길어져(언제 해제될지도 알 수 없다) 둘 중 IDisposable이 더 권장된다 - 가바지로 간주된 객체는 다음 가비지 수집세대에서 삭제되지만 - finalizer를 갖고있는 객체는 가비지로 판단되더라도 finalizer를 호출하기 전까지 공간이 해제가 안된다. # 할당구문보다 멤버 초기화 구문이 좋다. - 생성자..
[EFC#] effective c# - 1. 언어요소 # 지역변수를 선언할때는 var를 사용하는 것이 낫다 1. c#은 익명함수를 지원하면서 타입을 암시적으로 선언하는 방법을 제공한다. 2. 정확한 타입을 알지 못하는 상태에서 명시적으로 선언할경우 득보다 실이 많다 - 예1 잘못된 형변환: IEnumerable를 상속받는 IQueryable을 IEnumerable 타입으로 선언하는 경우 - IQueryable 타입은 원격 데이터를 참조할 경우, 여러단계에서 수행되는 LINQ 쿼리식을 SQL쿼리로 합한 후 그 값을 순회하는 시점까지 SQL쿼리 수행을 연기한다. (=네트워크 트래픽을 적게 씀) - 반면 IEnumerable는 단계별로 모두 원격에 SQL쿼리를 전달하고 로컬에 반환한다. - 예2 숫자 형변환: 특정 숫자값을 반환하는 메서드를 var 변수를 통해 ..
[c#] list, array, arraylist의 차이? 사실 성능이 강조되지 않는 개발이라면 세가지의 엄밀한 차이를 알 필요가 있을까 할수도 있지만, 그래도 알지 못한채로 세 자료타입을 사용하는건 영 찜찜한 일이기 때문에 한번 정리를 하기로 했다. 가장 명쾌하게 정리된 글이 스택오버플로우에 올라와있다. 참고글 https://stackoverflow.com/questions/32020000/what-is-the-difference-between-an-array-arraylist-and-a-list/32020072 string[] safelist = new string[3]; ArrayList item = new ArrayList(); List list = new List(); 위에서부터 순서대로 각 객체의 선언 방법이다. 참고글을 번역/정리하면 아래와 같다. ..
[.net] .net Standard에서 Linq to sql 파일 생성하기 참고원문 https://weblog.west-wind.com/posts/2017/Jun/22/MultiTargeting-and-Porting-a-NET-Library-to-NET-Core-20 .Net Standard로 프로젝트를 생성하면 .Net Core와 .Net Framework에서 사용될 수 있는 특성들을 함께 적용할 수 있다. 닷넷 스탠다드 프로젝트를 생성하면 Linq to Sql class가 추가가 안되는데, 이 때 타겟 프레임워크를 csproj의 targetframework 태그를 수정하면 된다.(properties에서 표시되는 ui로는 .net framwork로 타겟 프레임워크를 변경할 수 없다.) net45;net40;netstandard2.0 복수의 타깃을 지정하고 싶으면 세미콜론으로 ..