2013-07-06 22 views
9

次のコードでは、 "S:new()"部分の意味は分かりません。 Googleで詳細を見つけるキーワードは何ですか?どのような意味を意味するかS:new()in c#

public virtual void Print<S, T>() 
     where S : new() 
    { 
     Console.WriteLine(default(T)); 
     Console.WriteLine(default(S)); 
    } 
+1

タイプパラメータの制約を検索します。ここにリンクhttp://msdn.microsoft.com/en-us/library/d5x73970.aspx – qwr

+6

[C#コードの混乱のwhere句](http://stackoverflow.com/q/5461963)の重複は、私が見つかりましたSOを検索して[\ [c#\] generic where new](http://stackoverflow.com/search?q=%5Bc%23%5D+generic+where+new)を検索します。また、[new()は、[どこでT:new() '](http://stackoverflow.com/q/1085434)で行うのですか? –

答えて

16

new()制約は、特定の一般的なパラメータはデフォルトコンストラクタ(すなわち、パラメータなしのコンストラクタ)を持つことが必要であることを意味します。

この目的は、リフレクション/ Activator.CreateInstanceに頼らずに、一般的なパラメータタイプの新しいインスタンスをタイプして安全に構築できるようにすることです。例えば

:詳細については

public T Create<T>() where T : new() 
{ 
    // allowed because of the new() constraint 
    return new T(); 
} 

http://msdn.microsoft.com/en-us/library/sd2w2ew5%28v=vs.80%29.aspxをチェックしてください。

Googleの検索語句としては、 "C#new()constraint"を試してみたいと思います。

+1

正式名称は_constructor constraint_なので、これもGoogleのためのものです。 _拘束は、もちろん、最も重要な言葉です。 'T'が値型である場合、' new T(); 'は実際のインスタンスコンストラクタを呼び出さないことに注意してください。値型に対して 'default(T)'と同じ値を構築します。そのため、値型制約とコンストラクタ制約を組み合わせることは許されないので、 'T:struct、new()'(冗長であるとみなされます)となります。 'T 'が参照型の場合、' default(T) 'は' null'参照を返しますが、 'new T();'は実際のコンストラクタを呼び出します。 –

+0

事前定義された整数型と列挙型を含む任意の値型は、コンストラクタの制約を満たします。参照型は、それが(非抽象であり)** public **インスタンス化されていないインスタンスコンストラクタを持つ場合にのみそれを満たします。抽象クラスには 'public'コンストラクタはありません。 –