2013-07-16 11 views
5

Ich frage mich, ob es sinnvoll ist, sowohl "Klasse" und "neue()" Einschränkungen beim Definieren einer generischen Klasse zu haben. Wie in dem folgenden Beispiel:Ist es sinnlos, in einer generischen Klasse sowohl "class" als auch "new()" zu haben?

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

angeben Beide Randbedingungen, dass T ein Referenztyp sein sollte. Während die Einschränkung "class" nicht impliziert, dass ein impliziter Konstruktor existiert, erfordert die Einschränkung "new()" eine "class" mit einer zusätzlichen öffentlichen Konstruktordefinition.

Meine letzte (Formulierung für die) Frage ist: habe ich irgendwelche Vorteile von der Definition einer generischen Klasse wie in der obigen Anweisung, oder "new()" kapselt beide Einschränkungen?

+0

Ich glaube nicht, dass 'new()' einen Referenztyp erzwingt, nur einen öffentlichen parameterlosen Konstruktor, den Werttypen haben können (aber ich denke, sie haben dies sowieso als Werttypen, so dass es sinnlos ist). –

+0

@AdamHouldsworth: Werttypen * immer * haben einen öffentlichen parameterlosen Konstruktor. Und es ist nicht sinnlos, weil die Bedingung 'new()' dem Code innerhalb der Klasse erlaubt, eine neue Instanz von 'T' über' new T() 'zu erzeugen. Dies ist nicht möglich, wenn die Einschränkung weggelassen wird. –

+0

@DanielHilgarth Ja, ich fahre fort, das zu sagen, aber fair genug auf das sinnlose bisschen. Dies ist jedoch wahrscheinlich dasselbe wie "Standard (T)". –

Antwort

7

new() bedeutet keinen Referenztyp, also: class ist nicht redundant, wenn new() verwendet wird.

Der folgende Code zeigt, dass:

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

struct S {} 

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

Dieser Code kompiliert, was beweist, dass new() nicht, wenn Sie einen Verweis oder einen Werttyp verwenden schert.

+2

+1 Deutlich angegeben [in der Dokumentation] (http://msdn.microsoft.com/en-us/library/d5x73970 (v = vs.110) .aspx). –

+0

@AdamHouldsworth IMO sogar Dokumentation ist nicht wirklich klar. "struct" impliziert "new()", aber/then "new()" kann nicht mit "struct" verwendet werden (auch wenn sie das nicht sagen). –

+0

@Adriano 'new' kann mit' struct' verwendet werden, sie haben Konstruktoren. –

1

Nein, sie sind nicht nutzlos.

erster Parameter Klasse sichergestellt, dass das Typargument einen Referenztyp, einschließlich jeder Klasse sein muß, Schnittstelle, delegiert oder Array-Typen,

während der zweiten Parameter new() stellt sicher, dass es einen Parameter aufweist weniger Standardkonstruktor. Es wird nicht für jede Klasse funktionieren, die keinen Parameter-less-Standardkonstruktor hat.

Verwandte Themen