목록

where(제네릭 형식 제약 조건)

제네릭 정의의 where 절은 제네릭 형식, 메서드, 대리자 또는 로컬 함수의 형식 매개 변수에 대한 인수로 사용되는 형식에 대한 제약 조건 을 지정.

제약 조건은 인터페이스, 기본 클래스를 지정하거나 제네릭 형식을 참조, 값 또는 관리되지 않는 형식으로 요구할 수 있으며, 형식 인수에서 갖추고 있어야 하는 기능을 선언한다.

위의 내용은 레퍼문서내용 긁어온거라. 생각없이 읽으면 먼소린지 모르는데

즉, 요약하자면 특정조건을 갖춘 매개변수만 받겠다는 의미.

where T : 제약조건


#사용법(Usage)

예를 들어 형식 매개 변수 T가 IComparable 인터페이스를 구현하도록 제네릭 클래스 MyGenericClass를 선언할 수 있습니다.

//형식 매개 변수 T가 IComparable<T> 인터페이스를 구현하도록 제네릭 클래스 MyGenericClass를 선언
public class AGenericClass<T> where T : IComparable<T> { }

//이런 식으로 제약조건 건다.
public class UsingEnum<T> where T : System.Enum { }

public class UsingDelegate<T> where T : System.Delegate { }

public class Multicaster<T> where T : System.MulticastDelegate { }

형식 매개변수가 여러 개이면 각 형식 매개변수에 하나의 where절 사용

public interface IMyInterface { }

namespace CodeExample
{
    class Dictionary<TKey, TVal>
        where TKey : IComparable<TKey>
        where TVal : IMyInterface
    {
        public void Add(TKey key, TVal val) { }
    }
}
  • 참고 케이스

    //where T : new()  -> T는 매개변수가 없는 생성자를 가진 타입이어야 한다.
    delegate T MyDelegate<T>() where T : new();

#유니티에서의 활용

  • 싱글톤 만들 떄 사용 되기도 한다.

(여러 방법중 하나.. 나는 그냥 static class로 만드는게 심플한거 같다.)

using UnityEngine;
public abstract class Singleton<T> where T : class {protected static T instance = null;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = System.Activator.CreateInstance (typeof(T)) as T;
            }
            return instance;
        }
    }
}