본문 바로가기
반응형

EffectiveC#13

[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.
[Effective C# Item 39] function과 action 내에서는 예외가 발생하지 않도록 하라 일련의 값을 순차 처리하는 코드에서 중간지점에서 오류가 난다면 예외 발생 지점을 파악하기 어렵다. 특히 시퀀스 내 요소의 값을 직접 수정하는 경우 루틴 수행 이전으로 원복 하기는 매우 어렵다. 메서드가 절대로 예외를 유발하지 않도록 하려면 어떻게 해야할까? 단순하게 생각해 볼 수 있는건 예외가 발생할 상황을 필터링 하는 것이다. allEmployees.FindAll( e => e.Classification == EmployeeType.Active). ForeEach(e => e.MonthlySalary *= 1.05M); 하지만 이는 예상 가능한 오류에 대해서만 처리가 가능하다. 예외가 발생하지 않도록 작성하는 것이 불가능하다면, 원본 시퀀스의 복사본으로 알고리즘을 수행하고 정상 완료되는 경우에 시퀀스를.. 2023. 5. 2.
[Effective C# Item 38] 메서드보다 람다 표현식이 낫다. 람다 표현식을 사용하여 코드를 작성하면 동일한 코드를 반복하게 될 때가 있다. // 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.MonthlySalary < 4000 select e; 두 람다 식에서 중복되는 람다식을 메서드로.. 2023. 5. 2.
반응형