C# Study/이펙티브 C# 맨텀 2021. 4. 26. 19:33
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 제네릭을 사용할 때 타입 매개 변수에 대한 제약조건을 사용하여 타입을 제한할 수 있다. 제약조건의 이점 제약 조건을 통해 함수 내에서 특정 인터페이스로 형 변환이 가능한지 확인한 후, 해당 인터페이스의 메서드를 사용하는 경우가 있다. public static bool AreEqual(T left, T right) { if (left == null) return right == null; if(left is IComparable) { IComparable lval = left as IComparable; if (right is IComparable) return lval.CompareTo(right) == 0; ...... } } ..
C# Study/이펙티브 C# 맨텀 2021. 4. 26. 17:33
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. Dispose 패턴 객체가 비관리 리소스를 포함하는 경우 정리 작업은 굉장히 중요하다. .NET Framework 내부에서는 이에 대해 표준화된 패턴을 사용하고 있으며, 성능에 미치는 부정적인 영향을 최소화 하기 위해서는 규칙에 따라 리소스를 정리해야 한다. 최상위 베이스 클래스는 다음의 작업을 수행해야 한다. 1) 리소스를 정리하기 위해서 IDisposable 인터페이스를 구현해야 한다. 2) 멤버 필드로 비관리 리소스를 포함하는 경우 방어적으로 동작할 수 있도록 finalizer를 추가해야 한다. 3) Dispose와 finalizer는 실제 리소스 정리 작업을 수행하는 다른 가상 메서드에 작업을 위임하도록 작성돼야 한다. 파..
C# Study/이펙티브 C# 맨텀 2021. 4. 26. 16:11
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 상속된 클래스의 생성자는 꽤 주의해서 다루어야 한다. 2021.04.26 - [C# Study/C# 케이스 스터디] - C# 상속 클래스 부모의 생성자 호출 순서 상속 클래스가 인스턴스화 될 때 부모의 생성자가 먼저 호출된다. 그런데 부모 생성자 내에서 호출하는 함수가 가상 함수(virtual)로 지정되어있고, 이를 자식 클래스에서 오버라이딩한 경우를 생각해보자. public class TestScript : MonoBehaviour { [Button] public void Test() { var Temp = new B("test"); } } public class A { public A() { Debug.Log("A"); MyM..
C# Study/이펙티브 C# 맨텀 2021. 4. 25. 16:18
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 아무리 C#에서 자동으로 가비지 컬렉터가 불필요한 메모리를 관리해준다지만, 가비지 수집기가 과도하게 동작할경우 심각한 성능 문제를 야기할 수 있다. using 문 - 잠시 사용되고 버려지는 특정 객체를 사용하는 구간을 명시해준다. using(MyClass t = new MyClass()) { t.MyMethod(); } 자주 사용될 지역 변수는 멤버로 선언하자 - 참조타입 객체를 매번 생성하는 경우라면 멤버 변수로 변경하면 가비지를 줄일 수 있다. 클래스 자체가 많다면 정적 멤버로 선언하자 - 멤버변수로 선언한다면 각 클래스마다 똑같은 객체가 클래스마다 생성될 것이다. - 이를 정적 멤버로 선언해두면 같은 타입 클래스끼리는 공용으..
C# Study/이펙티브 C# 맨텀 2021. 4. 25. 15:40
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. C#에서는 객체 초기화를 위한 코드가 반복되는 것을 막기 위해 생성자 체인 기법을 제공한다. 생성자 체인 - 임의의 생성자가 동일 클래스 내의 정의된 다른 생성자를 호출하는 방식. - 기본값을 가진 생성자를 추가 생성해두고, 다른 생성자를 호출하여 코드 중복을 최소화 한다. public class MyClass { private int count ; private string name; public MyClass() : this(0, "") { } public MyClass(int count) : this(count, string.Empty) { } public MyClass(int count, string name) { this..
C# Study/이펙티브 C# 맨텀 2021. 4. 25. 14:50
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 정적 변수(static)을 포함한다면 인스턴스를 생성하기 전에 반드시 정적 멤버 변수를 초기화해야 한다. 정적 변수 초기화에는 정적 멤버 초기화, 정적 생성자 두 가지 선택지가 존재한다. 정적 필드를 초기화하는 게 큰 작업이라면 Lazy를 사용하여 초기화 작업을 미룰 수 있다. 정적 멤버 초기화 - 일반 필드의 멤버 초기화와 같이 간단하게 초기화할 때 사용할 수 있다. - 정적 생성자가 호출되기 이전에 실행되며, 베이스 클래스의 정적 생성자보다도 먼저 호출된다. - 예외를 처리하지 못하기 때문에 예외 발생 가능성이 있다면 정적 생성자를 사용하자. public class MySingleton { private static reado..