1
2
3
4
5
public class SomeClass<TSomeType> : BaseClass<TSomeType>
where TSomeType : SomeType, new()
{
//body
}
제네릭
저장하거나 사용하는 하나 이상의 형식에 대한
자리 표시자(형식 매개 변수)를 포함하는
클래스, 구조체, 인터페이스, 메서드.
제네릭 컬렉션 클래스
저장하는 개체 형식에 대해
형식 매개 변수를 자리 표시자로 사용.
형식 매개 변수
필드의 형식과 메서드의 매개 변수 형식으로 표시.
제네릭 메서드
형식 매개 변수를 반환 값의 형식 또는
정식 매개 변수 중 하나의 형식으로 사용할 수 있습니다.
다음 코드에서는 간단한 제네릭 클래스 정의를 보여 줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
public class Generic<T>
{
public T Field;
}
public static void Main()
{
Generic<string> g = new Generic<string>();
g.Field = "A string";
//...
Console.WriteLine("Generic.Field = \"{0}\"", g.Field);
Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName);
}
일반 용어인 제네릭 형식에는
생성된 형식과 제네릭 형식 정의가 모두 포함됩니다.
1
2
3
4
5
6
T Generic<T>(T arg)
{
T temp = arg;
//...
return temp;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
T G<T>(T arg)
{
T temp = arg;
//...
return temp;
}
}
class Generic<T>
{
T M(T arg)
{
T temp = arg;
//...
return temp;
}
}
형식 안전성.
제네릭을 사용하면 컴파일러에서
형식 안전성을 보장해야 하는 부담이 줄어듦.
컴파일 타임에 올바른 데이터 형식이 적용되므로
코드를 작성하여 데이터 형식을 테스트할 필요가 없음.
형식 캐스팅의 필요성과 런타임 오류 발생 가능성도 감소.
코드의 양 감소, 코드를 재사용 쉬워짐.
기본 형식에서 상속하고 멤버를 재정의할 필요가 없음.
예를 들어 LinkedList<T> 은 즉시 사용할 수 있습니다.
다음 변수 선언을 사용하면 문자열의 연결된 목록을 만들 수 있습니다.
1
LinkedList<string> llist = new LinkedList<string>();
성능 향상.
제네릭 컬렉션 형식은
값 형식을 boxing할 필요가 없기 때문에
일반적으로 값 형식 저장 및 조작 시 성능이 보다 우수.
제네릭 대리자를 사용하면
여러 대리자 클래스를 만들지 않고도
형식이 안전한 콜백을 사용할 수 있습니다.
예를 들어 Predicate<T> 제네릭 대리자를 사용하면
특정 형식에 대해 고유한 검색 기준을 구현하는 메서드를 만든 다음
Array , Find, FindLast등의 FindAll형식 메서드와 함께
사용할 수 있다.
제네릭을 통해 동적으로 생성된 코드를 원활하게 실행.
동적으로 생성된 코드에서 제네릭을 사용하는 경우 형식을 생성할 필요가 없습니다. 이로 인해 전체 어셈블리를 생성하는 대신 간단한 동적 메서드를 사용할 수 있는 시나리오의 수가 증가합니다. 자세한 내용은 방법: 동적 메서드 및 DynamicMethod를 정의하고 실행합니다.
제네릭 형식은 MarshalByRefObject 와 같은
대부분의 기본 클래스에서 파생될 수 있으며,
제약 조건을 사용하면
제네릭 형식 매개 변수가 MarshalByRefObject와 같은
기본 클래스에서 파생되어야 하도록 지정할 수 있습니다.
그러나 .NET에서는
컨텍스트에 바인딩된 제네릭 형식을 지원하지 않습니다.
제네릭 형식이 ContextBoundObject에서 파생될 수는 있지만
해당 형식의 인스턴스를 만들려고 하면
TypeLoadException이 발생합니다.
열거형은 제네릭 형식 매개 변수를 포함할 수 없습니다.
열거형은 Visual Basic, C#, C++를 사용하여 정의되는
제네릭 형식에 중첩되는
경우 부수적으로만 제네릭이 될 수 있습니다.
자세한 내용은 공용 형식 시스템에서 “열거”를 참조하세요.
경량의 동적 메서드는 제네릭이 될 수 없습니다.
Visual Basic, C#, C++에서는
모든 바깥쪽 형식의 형식 매개 변수에 형식이 할당된 경우가 아니면
제네릭 형식으로 묶인 중첩 형식을 인스턴스화할 수 없습니다.
다시 말해서, 리플렉션에서 이러한 언어를 사용하여 정의되는 중첩 형식은
모든 바깥쪽 형식의 형식 매개 변수를 포함합니다.
따라서 바깥쪽 형식의 형식 매개 변수를
중첩 형식의 멤버 정의에서 사용할 수 있습니다.
자세한 내용은 MakeGenericType의 “중첩 형식”을 참조하세요.