2013-07-16 14 views
5

ジェネリッククラスを定義するときに "class"と "new()"の両方の制約を持つことに意味があるのだろうかと思います。次の例のように:ジェネリッククラスに "class"と "new()"の両方の制約があることは意味がありませんか?

class MyParanoidClass<T> where T : class, new() 
{ 
//content 
} 

両方の制約は、Tが参照型であることを指定します。 "class"制約は暗黙のコンストラクタが存在することを意味するわけではありませんが、 "new()"制約には追加のpublicコンストラクタ定義を持つ "class"が必要です。

私の最終的な質問は、上記のようにジェネリッククラスを定義することによるメリットがありますか、または両方の制約を "new()"でカプセル化していますか?

+0

私は 'new()'は参照型を強制しないと思っています。値の型が持つことができるpublic型のパラメータのないコンストラクタだけです。(値の型であるため、 –

+0

@AdamHouldsworth:値の型は常に*パブリックなパラメータのないコンストラクタを持ちます。 'new()'制約はクラス内のコードが 'new T()'を使って 'T 'の新しいインスタンスを作成できるようにするため、無意味ではありません。これは、制約が省略されている場合は不可能です。 –

+0

@DanielHilgarthはい、私はそれを言うために続けますが、無意味なビットで十分公正です。しかし、それはおそらく 'default(T)'と同じでしょう。 –

答えて

7

new()は参照タイプを意味しないため、いいえ、new()を使用するとclassは冗長ではありません。

void Main() 
{ 
    new MyParanoidClass<S>(); 
} 

struct S {} 

class MyParanoidClass<T> where T : new() 
{ 
    //content 
} 

このコードは、あなたが参照または値型を使用する場合new()は気にしないことを証明し、コンパイルします。

次のコードは、ことを示しています。

+2

+1 [ドキュメントに記載されています](http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.110)asp#)。 –

+0

@AdamHouldsworth IMOのマニュアルは実際にはっきりしていません。 "struct"は "new()"を意味しますが、 "new()"は "struct"と一緒に使用することはできません。 –

+0

@Adriano 'new'は' struct'と一緒に使うことができます。コンストラクタを持っています。 –

1

いいえ、彼らは無駄ではありません。

最初のパラメータクラスは、型引数は任意のクラス、インタフェース、デリゲート、または配列型を含む参照型でなければならないことを確実にする、

第二パラメータに対し新しい()はそれがパラメーターを有することを保証より少ないデフォルトコンストラクタ。デフォルトのコンストラクターよりも少ないパラメーターを持たないクラスでは機能しません。