블로그 이미지
Magic_kit
study 관련자료를 한곳으로 자기 개발 목적으로 재태크 재무 관리 목적으로 일상생활의 팁을 공유 하기 위하여 블로그를 개설 하였습니다.

calendar

1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

Category

Recent Post

Recent Comment

Archive

2009. 8. 18. 10:26 .Net Project/.Net C#
반응형

 형식매개변수에 대한 제약조건 사용해야 하는 이유?

제네릭 목록의 항목을 검사하여 그 유효성 여부를 확인하거나 이 항목을 다른 항목과
비교하려는 경우, 컴파일러는 클라이언트 코드에서 지정할 수 있는 모든 형식 인수에 대해 호출해야 할 메서드나 연산자가 지원되는지 확인해야 합니다.

하나 이상의 제약 조건을 제네릭 클래스 정의에 적용하면 이러한 확인이 가능합니다.

예를 들어) 기본 클래스 제약 조건에서는 이 형식의 개체와 이 형식에서 파생된 개체만이 형식 인수로 사용될 수 있음을 컴파일러에 알립니다. 컴파일러에서 이를 확인하면 사용자는 제네릭 클래스에서 해당 형식의 메서드를 호출할 수 있습니다.
 
제약 조건은 컨텍스트 키워드 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



반응형
posted by Magic_kit