반응형 EffectiveC#13 [Effective C# Item 37] 쿼리를 사용할 때는 즉시 평가보다 지연 평가가 낫다 쿼리를 정의한다고 해서 결과 데이터나 시퀀스를 즉각적으로 얻어오는 것이 아니다. 실제로는 쿼리를 정의하는 작업은 수행 시에 어떤 과정으로 작업을 수행할지에 대한 절차만을 정의한 것에 지나지 않는다. 지연 평가(lazy evaluation) : 실제로 쿼리의 결과를 이용하여 순회를 수행할 때 결과가 생성. 즉시 평가(eager evaluation) : 일반 변수를 사용하는 것처럼 즉각적으로 그 값을 얻어오는 것. 지연 평가는 어떻게 동작하는가? 아래 코드는 현재 시간을 생성하는 시퀀스를 작성하고 그 시퀀스를 세계 공용 포맷으로 다시 변경하는 코드이다. var sequence1 = Generate(10, () => DateTime.Now); // 오전 8:00 Thread.Sleep(60000); //.. 2023. 5. 2. [Effective C#] Item 36 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라 LINQ는 쿼리 언어와 그 쿼리 언어를 일련의 메서드 집합으로 변환하는 2개의 핵심 구조를 기반으로 한다. C# 컴파일러는 쿼리 언어로 작성된 쿼리 표현식을 메서드 호출 구문으로 변환해준다. C#은 쿼리 표현식 패턴에 포함된 개별 메서드가 어떤 의미를 가지고 있는지 전혀 개의치 않는다. 예로 들어 컴파일러는 Where()과 같은 메서드가 쿼리 표현식의 패턴에서 의도하는 동작을 온전히 수행하는지를 확인하지 않으며, 구문상의 오류만을 확인할 뿐이다. 따라서 유효한 구조의 메서드라 하더라도 그 메서드가 우리가 의도하는 바를 제대로 구현하고 있는지를 컴파일러가 확인할 수 없다. 따라서 우리는 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 제대로 알아둘 필요가 있다. where : Wher() where는 .. 2023. 2. 23. [Effective C#] Item 35 확장 메서는 절대 오버로드 하지 마라 확장 메서드는 설계 의도를 드러내는 방법으로는 썩 훌륭하지 않다. 확장 메서드를 사용하는 대부분의 경우가 기존에 개발된 타입을 개선하기 위해서이지 타입의 본질적인 동작 방식을 변경하기 위해서는 아니기 때문이다. 왜 확장 메서드로 타입을 확장해서는 안 되는가? 확장 메서드를 이용하여 인터페이스에 대한 기본 구현체를 제공하는 것이 괜찮은 방법인 것은ㅇ 분명하지만 타입을 확장하기 위한 용도로 사용하는 것은 적절하지 않다. 확장 메서드를 과도하게 사용하거나 잘못 사용하면 메서드 충돌로 인해 유지보수 비용이 급격하게 증가하는 곤경에 처할 수 있기 때문이다. 예시) Person 클래스 public sealed class Person { public string FirstName { get; set; } public.. 2023. 2. 1. [Effective C# Item 33] 필요한 시점에 필요한 요소를 생성하라 이터레이터 메서드가 입력 변수로 반드시 시퀀스를 받을 필요는 ㅇ벗다. 이터레이터 메서드를 구현할 때 새로운 시퀀스를 출력하기 위해 yield return을 자주 사용하는데 이 과정에서 입력 시퀀스를 활용하는 대신 새로운 팩토리 메서드를 이용할 수도 있다. 작업을 수행하기 전에 필요한 요소를 모두 생성해서 컬렉션에 저장해두는 대신 필요할 때마다 개발 요소를 생성하는 식이다. 이 방법으로 코드를 작성하면 사용되지 않을 요소를 미리 생성하는 것을 피할 수 있다. 1. 정숫값의 시퀀스 생성 static IList CreateSequence(int numberOfElements, int startAt, int stepBy) { var collection = new List(numberOfElements); for.. 2022. 12. 12. 이전 1 2 3 4 다음 반응형