2013-07-06 9 views
9

Im folgenden Code weiß ich nicht, was bedeutet "wo S: new()" Teil. Was ist das Keyword, um weitere Informationen in Google zu finden?Was bedeutet, wo S: neu() in C#

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

Suche nach Einschränkungen für Typparameter. Hier ist Link http://msdn.microsoft.com/en-us/library/d5x73970.aspx – qwr

+6

Duplikate von [C# Code Verwirrung der Where-Klausel] (http://stackoverflow.com/q/5461963), die ich gefunden habe durch Suchen nach SO nach [\ [C# \] generisch wo neu] (http://stackoverflow.com/search?q=%5Bc%23%5D+generic+where+new). Auch [Was macht new() in 'where T: new()'] (http://stackoverflow.com/q/1085434) was SO in der Seitenleiste "Verwandte Fragen" anzeigt. –

Antwort

16

Die new() constraint bedeutet, dass die bestimmte generische Parameter erforderlich ist, einen Standard-Konstruktor aufweisen (i. E. Ein Konstruktor ohne Parameter).

Der Zweck davon ist in der Regel, dass Sie neue Instanzen generischer Parametertypen typsicher schreiben können, ohne auf reflection/Activator.CreateInstance zurückgreifen zu müssen.

Zum Beispiel:

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

Weitere Informationen besuchen Sie http://msdn.microsoft.com/en-us/library/sd2w2ew5%28v=vs.80%29.aspx.

Soweit ein Google-Suchbegriff, würde ich versuchen, "C# new() Einschränkung".

+1

Der formale Name ist ein _constructor constraint_, also können Sie auch googeln. _Constraint_ ist natürlich das wichtigste Wort. Beachten Sie, dass, wenn 'T' ein Werttyp ist,' 'new T();' keinen Konstruktor einer realen Instanz aufruft; Für Wertetypen wird derselbe Wert wie für 'default (T)' erstellt. Aus diesem Grund ist es nicht erlaubt, eine Werttypbeschränkung und eine Konstruktbeschränkung zu kombinieren, daher ist dies nicht erlaubt: 'where T: struct, new()' (wird als redundant betrachtet). Wenn "T" ein Referenztyp ist, gibt "default (T)" eine "Null" -Referenz, während "new T();" einen echten Konstruktor aufruft. –

+0

Jeder Werttyp, einschließlich vordefinierter Integertypen und Aufzählungstypen, erfüllt die Constructor-Einschränkung. Ein Referenztyp erfüllt sie, wenn und nur dann, wenn er nicht-abstrakt ist und einen ** öffentlichen '** Zero-Parameter-Instanzkonstruktor hat. (Abstrakte Klassen _should_ haben keine 'öffentlichen' Konstruktoren.) –