반응형 C#59 [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. [Effective C#] Item 40 지연 수행과 즉시 수행을 구분하라 명령형 코드(Imperative Code) [즉시 수행] 어떻게 작업을 수행해야 하는지를 단계별로 세분화 하여 기술한다. 필요한 매개변수를 모두 계산한 다음에야 비로소 메서드를 호출한다. 아래의 예시에서는 항상 모든 메서드를 호출하며, 각 메서드의 부수효과는 반드시 한 번씩만 발생한다. 메서드를 호출하고 그 결과를 다른 메서드에 전달한다. var answer = Dostuff(Method1(), Method2(), Method3()); 선언적 코드(Declarative Code) [지연 수행] 해결석이며 무슨 작업을 해야 하는지를 정의한다. 각 메서드의 수행 경로가가 필요한 경우에만 호출된다. 아래의 예시에서는 메서드가 각기 호출될 수 도 있고 아닐 수 도 있으며, 여러번 호출 될 수 도 있다. var .. 2023. 5. 2. 이전 1 2 3 4 5 6 7 8 ··· 15 다음 반응형