본문 바로가기

c#109

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.
Effective C# Item 12 : 할당 구문보다 멤버 초기화 구문이 좋다 할당 구문보다 멤버 초기화 구문이 좋다 클래스를 만들다 보면 종종 둘 이상의 생성자를 작성해야 하는 경우가 있다. 그런데 생성자 내에서 멤버 변수들의 값을 초기화하도록 코드를 작성하다 보면 모든 생성자 내에서 멤버 변수들을 초기화해야 함에도 불구하고 자칫 초기화 코드를 누락하는 경우가 생긴다. 이러한 오류를 범하지 않으려면 생성자의 본문에서 멤버 변수에 값을 할당하기보다 멤버 초기화 구문(Member Initializer)을 사용하는 것이 좋다. 정적 변수와 인스턴스 변수 어느 쪽이라도 가능한 한 멤버 초기화 구문을 사용하는 것이 좋다. 멤버 변수를 선언할 때 객체를 함께 생성하는 것은 C#에서 매우 자연스러운 구문이므로 멤버 변수를 선언할 때는 항상 초기화 구문을 사용하자. public class My.. 2023. 10. 20.