본문 바로가기

effectivec#10

Effective C# Item 36 : 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라 LINQ는 쿼리 언어와 그 쿼리 언어를 일련의 메서드 집합으로 변환하는 2개의 핵심 구조를 기반으로 한다. C# 컴파일러는 쿼리 언어로 작성된 쿼리 표현식을 메서드 호출 구문으로 변환해 준다. 클래스 사용자의 관점에서 볼 때 쿼리 표현식은 단순히 메서드 호출 구문의 다른 표현 방법일 뿐이다. where 절은 적절한 인자를 이용하여 Where()라는 메서드를 호출하는 코드로 변환된다. 클래스 설계자의 관점에서는 기본 프레임워크에서 제공하는 메서드들이 어떻게 구현됐는지를 살펴보고 더 나은 방법으로 구현할 수 있을지를 판단해야 한다. 더 나은 구현 방법이 없다면 기본 라이브러리를 그대로 사용하면 되겠지만 개선의 가능성이 있다면 우선 쿼리 표현식이 메.. 2024. 2. 13.
Effective C# Item 17 : 표준 Dispose 패턴을 구현하라 표준 Dispose 패턴을 구현하라 비관리 리소스(Unmanaged Resource)를 포함하는 타입을 작성할 때 리소스 관리를 어떻게 해야 할지를 살펴보자. .NET Framework 내부에서는 비관리 리소스를 정의하는 표준화된 패턴을 사용하고 있으므로 새로운 타입을 만들 때도 동일한 패턴을 이용하는 것이 좋다. 바로 Dispose 패턴을 사용하면 된다. 이 패턴을 이용하면 개발자들에게 IDisposable 인터페이스를 통해서 리소스를 삭제할 수 있는 기능을 안정적으로 제공할 수 있다. 게다가 비관리 리소스를 명시적으로 정리해야 한다는 사실을 잊어버리거나 인지하지 못한 경우에도 finalizer를 통해 올바르게 리소스가 정리될 수 있도록 해준다. 표준 Dispose 패턴은 가비지 수집기와 연계되어 동작.. 2023. 11. 3.
Effective C# Item 13 : 정적 클래스 멤버를 올바르게 초기화하라 정적 클래스 멤버를 올바르게 초기화하라. 정적 멤버 변수를 포함하는 타입이 있다면 인스턴스를 생성하기 전에 반드시 정적 멤버 변수를 초기화해야 한다. 이를 위해 C#에서는 정적 멤버 초기화 구문(static member initializer) 정적 생성자(static constructors) 라는 두 가지 기능을 제공한다. 정적 생성자는 타입 내에 정의된 모든 메서드, 변수, 속성에 최초로 접근하기 전에 자동으로 호출되는 특이한 메서드다. 이 메서드를 활용하면 정적 변수를 초기화하거나, 싱글톤 패턴을 적용하거나, 혹은 여타의 작업을 효과적으로 수행할 수 있다. 정적 변수를 초기화하기 위해서 인스턴스 생성자나 전용의 private:메서드 혹은 다른 관용구를 사용해서는 안된다. 정적 필드를 초기화하는 과정이.. 2023. 10. 27.
Effective C# Item 16 : 생성자 내에서는 절대로 가상 함수를 호출하지 말라 생성자 내에서는 절대로 가상 함수를 호출하지 말라 객체가 완전히 생성되기 이전에 가상 함수를 호출하면 이상 동작을 일으킨다. 어떤 타입이든 생성자가 수행을 완료할 때까지는 객체가 완전히 생성되었다고 할 수 없다. 따라서 생성자 내에서 가상 함수를 호출하면 예상처럼 동작하지 않는다. 다음 코드를 살펴보자. class B { protected B() { VFunc(); } protected virtual void VFunc() { Console.WirteLine("VFunc in B"); } } class Derived : B { private readonly string msg = "Set by initializer"; public Derived(string msg) { this.msg = msg; } p.. 2023. 10. 25.
Effective C# Item 2 : const보다는 readonly가 좋다 const보다는 readonly가 좋다 C#은 컴파일타임 상수와 런타임 상수 두 유형의 상수를 지원한다. 이 둘은 서로 다르게 동작하기 때문에 적절하지 않은 상수 타입을 사용하면 상응하는 대가가 따른다. 컴파일타임 상수보다는 런타임 상수를 사용하라. 컴파일타임 상수가 약간 더 빠르긴 하지만 런타임 상수에 비해 유연성이 상당히 떨어진다. 컴파일타임 상수는 성능이 매우 중요하고 상수의 값이 절대로 바뀌지 않는 경우에만 제한적으로 사용하는 것이 좋다. 런타임 상수는 readonly 키워드를 사용하여 선언하고, 컴파일타임 상수는 const 키워드를 사용한다. // 컴파일 타임 상수 public const int Millenium = 2000; // 런타임 상수 public static readonly int T.. 2023. 10. 24.
Effective C# Item 4 : string.Format()을 보간 문자열로 대체하라 string.Format()을 보간 문자열로 대체하라 컴퓨터 프로그램을 최초로 작성하기 시작한 시절부터 개발자들은 컴퓨터에 저장된 정보를 사람이 읽을 수 있는 형태로 변경하는 코드를 꾸준히 개발해 왔다. C#에도 C에서 널리 사용되던 API를 그대로 수용하여 동일한 방법으로 문자열을 만들 수 있었다. 이제는 이러한 방법에서 벗어나 C# 6.0에 새롭게 도입된 문자열 보간 기능을 사용해 보자. 고전적인 문자열 포매팅 방식 대비 보간 문자열의 장점 코드 가독성이 대폭 향상되었다. 컴파일러 입장에서는 정적 타입 검사를 수행할 수 있기 때문에 실수를 미연에 방지할 수 있다. 기존 방식에 비해 문자열을 생성하기 위한 표현식이 더 풍부해졌다. 기존에 널리 사용되던 string.Format() 또한 문자열 변환 과정.. 2023. 10. 23.