一部の既存のコードでは、次のように表示されます。
public abstract class BasicComponent<T> : IBasicComponent<T>
where T : class, new()
抽象クラスとインターフェースが何であるかを知っています。しかし、それは何をしていてwhere T
、拡張するclass
とどうなりnew()
ますか?
一部の既存のコードでは、次のように表示されます。
public abstract class BasicComponent<T> : IBasicComponent<T>
where T : class, new()
抽象クラスとインターフェースが何であるかを知っています。しかし、それは何をしていてwhere T
、拡張するclass
とどうなりnew()
ますか?
これらはジェネリック型の制約です。
使用class
する手段はT
、クラス (インターフェイス、デリゲート、および配列を含む) であるnew
必要があり、パラメーターのないパブリック コンストラクターが必要です。
リンクされた MSDN ドキュメントから:
where T : class - 型引数は参照型でなければなりません。これは、任意のクラス、インターフェイス、デリゲート、または配列型にも適用されます。
where T : new() - 型引数には、パラメーターなしのパブリック コンストラクターが必要です。他の制約と一緒に使用する場合、 new() 制約は最後に指定する必要があります。
Where
ジェネリック型パラメーターの制約を宣言するために使用されます。これは、コンパイラーが型パラメーターについて十分に認識していないために、他の方法では許可できなかったいくつかのことを許可できることを意味します。
where T : class;
T
class
これは、型パラメーターを a に制限します。これは、このメソッドがclass
値型または構造体としてではなく、としてのみ受け入れることを意味します。
where T : new();
T
これにより、型パラメーターは、パラメーターなしのコンストラクターが定義されている型に制限されます。したがって、コンパイラは次のものを受け入れることができます。
T t = new T();
where T
ジェネリック型 T を制限します
class
T がクラスである必要があり、構造体または値の型がないことを
new
意味します。これは、T がパラメーターなしのコンストラクターを持たなければならないことを意味します
T
参照型 ( ) である必要がclass
あり、パラメーターなしのコンストラクターが必要new()
です。
これは、BasicComponent<T>
およびそれから派生したクラスが、そのようなコンテキストでのみ実行できることを実行できることを意味します。それはまた、そうでなければ無意味なことをすることができることを意味します。逆に言えば、持っていない場合です。
public abstract class BasicComponent<T>
{
public T Build()
{
return new T();//can't do this without `new()` constraint.
}
public bool Check(T item)
{
return item != null;//only references types can be null, so
//can't do this without `class` constraint
//though notice that `default(T)` works for
//both reference and value types.
}
public bool IsSame(T x, T y)
{
return ReferenceEquals(x, y);//pointless with value-types.
//x and y would be passed to IsSame by
//copying, then boxed to two different objects
//then this will always return false.
//as part of a generic implementation that
//accepted both value and reference types
//it might be that we still care to do something
//for reference-equals, in other cases the
//pointlessness would make the whole class pointless
//for value types.
}
public abstract void Whatever();//just added in so the class still does something abstractly!
}
から派生したクラスはBasicComponent<T>
、少なくとも同じくらい厳密でなければならないことに注意してくださいBasicComponent<T>
。それには、独自の制約をさらに追加する場合と追加しない場合があるすべての制約が必要です。
T は、使用する一般的な部分です。
キーワードはフィルターのように機能します (他の言語と同様)
ここでは、クラスと new() を使用しました
つまり、
このジェネリック クラスに渡される任意のクラスを使用できます。
new() は、クラスにパラメーターのないコンストラクターがあることを伝えていることを意味します。