C# Study/이펙티브 C# 맨텀 2021. 5. 12. 14:24
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 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; // IEnumerable var q = (from c in dbContext.Customers where c.City == "London" select c).AsEnumerable()..
C# Study/이펙티브 C# 맨텀 2021. 5. 3. 14:49
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 개발자는 일반적으로 블록을 벗어나면 지역변수가 가비지 콜렉터에 의해 정리될 것이라 생각하여 지역변수의 수명을 거의 신경쓰지 않는다. 하지만 클로저(Closure)는 이러한 규칙을 벗어난다. 캡처된 변수를 사용하는 마지막 델리게이트가 가비지화될 때 까지 해당 변수는 가비지로 간주되지 않는다. 일반적으로 단순 메모리 리소스만 사용한다면 적절한 시점에 가비지로 수집될 것이기 때문에 신경쓸 필요없지만 매우 무거운 리소스를 참고하고 있을경우 더욱 신경써야 한다. var counter = 0; var numbers = Extensions.Generate(30, () => counter++); 이 코드는 실제로 다음과 같은 코드를 생성한다. ..
C# Study/이펙티브 C# 맨텀 2021. 5. 2. 21:34
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 명령형 코드(Imperative Code) - 어떻게 작업을 수행해야 하는지를 단계별로 세분화하여 기술한다. - 필요한 매개변수를 모두 계산한 다음에야 비로소 메서드를 호출한다. - 아래의 예시에서는 항상 모든 메서드를 호출하며, 각 메서드의 부수효과는 반드시 한 번씩만 발생한다. - 메서드를 호출하고 그 결과를 다른 메서드에 전달한다. var answer = DoStuff(Method1(), Method2(), Method3()); 선언적 코드(Declarative Code) - 해결석이며 무슨 작업을 해야 하는지를 정의한다. - 각 메서드의 수행 결과가 필요한 경우에만 호출된다. - 아래의 예시에서는 메서드가 각기 호출될 수도..
C# Study/이펙티브 C# 맨텀 2021. 5. 2. 20:45
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 일련의 값을 순차 처리하는 코드에서 중간지점에서 오류가 난다면 예외 발생 지점을 파악하기 어렵다. 특히나 시퀀스 내 요소의 값을 직접 수정하는 경우 루틴 수행 이전으로 원복 하기는 매우 어렵다. 메서드가 절대로 예외를 유발하지 않도록 하려면 어떻게 해야할까? 우선 생각해볼 수 있는 건 단순하게 예외가 발생할 상황을 필터링하는 것이다. allEmployees.FindAll( e => e.Classification == EmployeeType.Active). ForeEach(e => e.MonthlySalary *= 1.05M); 하지만 이는 예상 가능한 오류에 대해서만 처리가 가능하다. 예외가 발생하지 않도록 작성하는 것이 불가능한..
C# Study/이펙티브 C# 맨텀 2021. 5. 2. 19:08
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 람다 표현식을 사용하여 코드를 작성하면 동일한 코드를 반복하게 될 때가 있다. // 20년 이상 근속자 var earlyFolks = from e in allEmployees where e.Classification == EmployeeType.Salary where e.YearsOfService >= 20 where e.MonthlySalary < 4000 select e; // 20년 미만 근속자 var newest = from e in allEmployees where e.Classification == EmployeeType.Salary where e.YearsOfService < 20 where e.MonthlySalar..
C# Study/이펙티브 C# 맨텀 2021. 5. 2. 16:52
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 지연평가 쿼리를 정의하더라도 결과 데이터나 시퀀스를 즉각 얻어 오는 것은 아니다. 쿼리 정의는 작업 절차를 정의한 것일 뿐이다. 실제로 쿼리의 결과를 이용하여 순회를 수행해야만 결과가 생성된다. 다음은 쿼리의 결과를 대상으로 추가적인 쿼리를 수행하는 코드이다. var sequence1 = Getnerate(10, () => DateTime.Now); var sequence2 = from value in sequence1 select value.ToUniversalTime(); sequence2를 순회할 때 sequence1이 이미 생성해둔 값을 순회하면서 개별 요소를 수정하는 것이 아니라, 순회 시점에 맞춰 sequence1이 값..