반응형 전체 글109 [Effective C#] Item 43 쿼리 결과의 의미를 명확히 강제하고, Single()과 First()를 사용하라. Single() / SingleOrDefault() Single() 두가지 오버로드된 버전이 존재한다 [list.Single, list.Single(Fnc predicate)] 첫번째 Single()은 단순히 데이터 집합에서 유일한 단일 요소를 반환한다. 두번째 Single()은 Func 대리자를 인자로 가지며 데이터 집합에서 특정 조건을 가지는 요소가 유일한 경우 해당 요소를 반환하다. 하지만 데이터집합에 어떠한 값도 없거나 둘이상의 값이 존재하거나 특정 조건을 가지는 요소가 둘이상일때 에러가 발생한다. SingleOrDefault() 해당 메서드는 Single을 사용했을때 발생하는 에러를 보안하여 Default 값을 반환한다. Single과 동일하게 두가지 오버로드된 버전이 존재한다. First() .. 2023. 5. 11. [Effective C#] Item 42 IEumerable<T> 데이터 소스와 IQueryable 데이터 소스를 구분하라 IEnumerable와 IQueryable는 거의 동일한 API정의를 가진다. 대부분의 경우 두 인터페이스는 상호 교환이 가능한다. 하지만 사실 이 둘은 동작 방식도 다르고 성능도 크게 차이 난다. //IQueryable var q = from c in dbContext.Customers where c.City = "London" select c; var finalAnswer = from c in q orderby c.Name select c; //IEumerable var q = (from c in dbContext.Customers where c.City == "London" select c).AsEumerable(); var finalAnswer = from c in q orderby c.Name .. 2023. 5. 11. [C#] Closure(클로저) 이해하기 Closure Closure(클로저) 란, 외부 변수나 필드와 같은 "환경"을 저장하고 있는 함수이다. 람다식을 사용해 전달할 때, 외부의 변수나 필드를 사용하는 경우 클로저로 처리된다. Action print = delegate (int j) { Console.WriteLine(j); }; 위 코드에서는 외부변수를 참조하지 않기 때문에 클로저가 아니다. int i = 2; Action print = delegate (int j) { Console.WriteLine(i + j); }; i = 3; 그렇다면 위의코드는 어떨까? 람다식이 i라는 외부변수를 참조하고있다. 이와 같이 외부변수를 참조하는 경우 클로저로 처리된다. 여기서 j가 1이라고 했을때 print를 실행하면 어떤값이 나올까? 4이다. 외부 변.. 2023. 5. 2. [Effective C#] Item 41 값비싼 리소스를 캡처하지 말라 일반적으로 개발자는 블록을 벗어나면 지역변수가 가비지 콜렉터에 의해 정리될 것이라 생각하여 지역변수의 수명을 거의 신경쓰지 않는다. 하지만 클로저(Closure)는 이러한 규칙을 벗어난다. 캡처된 변수를 사용하는 마지막 델리게이트가 가비지화 될 때 까지 해당 변수는 가비지로 간주되지 않는다. 일반적으로 단순 메모리 리소스만 사용한다면 적절한 시점에 가비지로 수집될 것이기 때문에 신경쓸 필요 없지만 매우 무거운 리소스를 참고하고 있을 경우 더욱 신경써야 한다. var counter = 0; var numbers = Extensions.Generate(30, () => counter++); 이 코드는 실제로 다음과 같은 코드를 생성한다. private class Closure { public int gene.. 2023. 5. 2. 이전 1 ··· 6 7 8 9 10 11 12 ··· 28 다음 반응형