형식매개변수에 대한 제약조건 사용해야 하는 이유? 제네릭 목록의 항목을 검사하여 그 유효성 여부를 확인하거나 이 항목을 다른 항목과 비교하려는 경우, 컴파일러는 클라이언트 코드에서 지정할 수 있는 모든 형식 인수에 대해 호출해야 할 메서드나 연산자가 지원되는지 확인해야 합니다. 하나 이상의 제약 조건을 제네릭 클래스 정의에 적용하면 이러한 확인이 가능합니다. 예를 들어) 기본 클래스 제약 조건에서는 이 형식의 개체와 이 형식에서 파생된 개체만이 형식 인수로 사용될 수 있음을 컴파일러에 알립니다. 컴파일러에서 이를 확인하면 사용자는 제네릭 클래스에서 해당 형식의 메서드를 호출할 수 있습니다. 제약 조건은 컨텍스트 키워드 where를 사용하여 적용됩니다. |
제약조건 | 설명 |
Where T : Struct | 형식인수가 값 형식이어야 한다 |
Where T : Class | 형식인수가 참조 형식이어야 한다 |
Where T : New | 형식 인수가 매개 변수 없는 공용 생성자 이며, 따른 제약 조건과 함께 사용하는 경우 new() 제약 조건은 마지막에 지정해야 합니다. |
Where T : (클래스이름) | 형식 인수가 지정된 기본 클래스이거나 지정된 기본 클래스에서 파생되어야 합니다. |
Whrere T: (인터페이스 이름) | 형식 인수가 지정된 인터페이스이거나 지정된 인터페이스를 구현해야 합니다 |
Whrere T: U | T에 대해 지정한 형식 인수가 U에 대해 지정한 인수이거나 이 인수에서 파생되어야 합니다. 이를 naked 형식 제약 조건 이라고 합니다 |
Program.Cs |
using System;
public interface IKs { }
public class Hyundai { }
public class Sonata : Hyundai { }
/// <summary>
/// 소나타 클래스에서 2개의 인스턴스 생성시
/// </summary>
//public class Sonata : Hyundai, IKs { }
/// <summary>
/// Hyundai클래스나 Hyundai 파생클래스
/// </summary>
/// <typeparam name="T"></typeparam>
public class CarClass<T> where T : Hyundai { }
/// <summary>
/// IKs 인터페이스
/// </summary>
/// <typeparam name="T"></typeparam>
public class CarInterface<T> where T : IKs { }
public class CarValue<T> where T : struct{} //값 타입
public class CarReference<T> where T : class { } //참조타입
public class CarNew<T> where T : new() { } //Default 생성자
public Class Main ) 함수매개변수에 대한 제약조건
public class 형식매개변수에대한제약조건
{
/// 함수매개변수에 대한 제약조건??<summary>
/// 제네릭 클래스를 정의하는 경우 클래스를 인스턴스화할 때 클라이언트
/// 코드에서 형식 인수에
/// 사용할 수 있는 형식의 종류에 제약 조건을 적용할 수 있습니다.
/// 클라이언트 코드가 제약 조건에서 허용하지 않는 형식을 사용하여 클래스를
/// 인스턴스화하려고 하면 컴파일 타임 오류가 발생합니다.
/// 이러한 제한을 제약 조건이라고 합니다.
/// 제약 조건은 컨텍스트 키워드 where를 사용하여 지정합니다.
/// 다음 표에서는 여섯 가지의 형식 제약 조건을 보여 줍니다.
/// </summary>
public static void Main()
{
CarValue<int> c = new CarValue<int>(); //struct 성공
CarReference<string> cs = new CarReference<string>(); //class 성공
CarNew<int> cn = new CarNew<int>(); //new 성공
///Hyundai클래스에서 파생된 클래스의 타입지정
CarClass<Sonata> cc = new CarClass<Sonata>();
///인터페이스 관련하여 지정하는 방법
CarInterface<IKs> h = new CarInterface<IKs>();
}
}
형식 매개변수에 대한 제약조건 참고사항)
http://msdn.microsoft.com/ko-kr/library/d5x73970.aspx
'.Net Project > .Net C#' 카테고리의 다른 글
96장 그룹(Group) 알고리즘 (0) | 2009.08.18 |
---|---|
95장 어트리뷰트(Attribute) (0) | 2009.08.18 |
93장 제네릭클래스(Generic Class) (0) | 2009.08.18 |
92장 제네릭클래스(List Generic Class) (0) | 2009.08.17 |
91장 예외처리(Exception) (0) | 2009.08.17 |