C# Study/이펙티브 C# 맨텀 2021. 4. 27. 16:29
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 무작정 제네릭 클래스를 만드는 것보다는 일반 클래스 내의 제네릭 메서드를 작성하는 편이 훨씬 좋은 경우가 있다. 제네릭 클래스는 클래스 전체를 하나의 제약조건으로 감싸게 되지만 일반 클래스 내의 제네릭 메서드는 각 메서드마다 개별적인 제약 조건을 설정할 수 있다. 제네릭 클래스 내의 유틸 함수 - 사용할때 를 매번 명시해야되는 귀찮음이 있다. public class MyTest { public void MyMethod() { int a = 0; int b = 2; var result = Utils.Max(a, b); } } public static class Utils { public static T Max(T left, T ri..
C# Study/이펙티브 C# 맨텀 2021. 4. 27. 16:06
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 제네릭과 함께 여러개의 오버로드된 메서드가 있는경우 컴파일러가 어느 메서드를 우선 선택하는지를 알아둘 필요가 있다. 부모 형식 vs 제네릭 형식 우선순위 - Parent 클래스를 상속받는 DerivedA 클래스 객체가 있을 때, 매개변수 형식으로 Parent를 취하는 메서드와 제네릭 T를 취하는 메서드가 오버로딩 되어있다. 두 메서드 중 어느 것이 호출될까? public abstract class Parent { public double Mass { get; set; } public string Name { get; set; } } public class DerivedA : Parent{ } public class MyTest {..
C# Study/이펙티브 C# 맨텀 2021. 4. 27. 15:46
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. C#에서 제약조건을 설정하는건 한계가 많은 것 처럼 보인다. 우선 제약 조건을 위해 인터페이스를 구현하는 방식을 생각해 볼 수 있다. Add() 메서드를 정의하기 위한 예시 - Add() 메서드를 정의하는 IAdd 인터페이스를 생성 - 이 인터페이스를 제약 조건으로 설정 - IAdd를 구현할 클래스를 생성 - IAdd가 정의한 Add()메서드를 구현 꽤 작업량이 많아지며, 클래스의 기본적인 구조를 해친다. 제약 조건으로 델리게이트 사용하기 제약조건으로 델리게이트를 작성하면 추가적인 작업없이 해결 가능하다. 특정 제네릭 클래스가 T타입의 두 객체를 더하는 메서드를 필요로 하는 경우 System.Func 델리게이트를 사용하면 필요한 ..
C# Study/이펙티브 C# 맨텀 2021. 4. 27. 15:16
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 타입의 가변성(variance), 즉 공변(convariance)과 반공변(contravariance)은 특정 타입의 객체를 다른 타입 객체로 변환할 수 있는 성격을 말한다. 공변과 반공변 - 타입 매개변수로 주어지는 타입이 상호 호환 가능할 경우 이를 이용하는 제네릭 타입도 호환 가능함을 추론하는 기능. - IEnumerable 를 매개변수로 취하는 메서드는 IEnumerable 객체도 받아들일 수 있어야 한다. - IEnumerable객체를 반환하는 메서드는 이 반환 객체를 IEnumerable 객체에 할당할 수 있어야 한다. 공변 (out) - X -> Y일 때, C를 C -> C인 경우 공변이다. - out 데코레이터를 사..
C# Study/이펙티브 C# 맨텀 2021. 4. 27. 14:11
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 제약조건은 타입 매개변수가 할 수 있는 것을 규정하지만, 무엇을 해서는 안 되는지는 규정하지 않는다. 제약조건이 요구하는 작업 외에는 신경을 쓰지 않는다는 것이다. 하지만 IDisposable을 구현하고 있다면 추가 작업이 필요하다. 메소드 내에서 타입 객체를 생성한 경우 - T가 IDisposable을 구현한 타입일경우 그냥 생성하고 사용하기만하면 리소스 누수가 발생할 수 있다. - T가 IDisposable을 구현했다면 using 블록이 끝날 때 Dispose()를 호출한다. public void GetThingsDone() { T driver = new T(); using(driver as IDisposable) { diri..
C# Study/이펙티브 C# 맨텀 2021. 4. 26. 22:21
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. .NET Framework는 객체의 선후 관계를 판단할 수 있는 IComparable와 IComparer를 제공한다. 더불어 C#은 타입 내의 관계 연산자 (, =)를 재 정의하여 선후 관계를 판단할 수 있다. IComparable, IComparable - 하나의 메서드만 정의되어있다. - 객체가 대상 객체보다 작으면 0보다 작은 값을, 같으면 0, 크면 0보다 큰 값을 반환한다. public interface IComparable { int CompareTo(object obj); } IComparer, IComparer - 하나의 메서드만 정의되어있다. - x가 y보다 작다면 0보다 작은 값을, 같으면 0, 크면 0보다 큰 ..