2013-07-16 9 views
5

Mi chiedo se abbia senso avere entrambi i vincoli "classe" e "nuovo()" quando si definisce una classe generica. Come nell'esempio seguente:È inutile avere entrambi i vincoli "class" e "new()" in una classe generica?

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

Entrambi i vincoli specificano che T deve essere un tipo di riferimento. Mentre il vincolo "classe" non implica che esista un costruttore implicito, il vincolo "nuovo()" richiede una "classe" con una definizione di costruttore pubblico aggiuntiva.

La mia domanda finale (formulazione per) è: ho qualche vantaggio nel definire una classe generica come nell'istruzione precedente, oppure "nuovo()" incapsula entrambi i vincoli?

+0

Non penso che 'new()' imponga un tipo di riferimento, solo un costruttore pubblico senza parametri, che i tipi di valori possono avere (ma penso che abbiano tutti questo comunque per essere tipi di valore quindi è quasi inutile). –

+0

@AdamHouldsworth: I tipi di valore * sempre * hanno un costruttore pubblico senza parametri. E non è inutile, perché il vincolo 'new()' consente al codice all'interno della classe di creare una nuova istanza di 'T' tramite' new T() '. Questo non è possibile se il vincolo è omesso. –

+0

@DanielHilgarth Sì, continuerò a dirlo, ma abbastanza equo sul pezzo inutile. Tuttavia, probabilmente sarà lo stesso di "default (T)". –

risposta

7

new() non implica un tipo di riferimento, quindi: No, class non è ridondante quando si utilizza new().

Il codice seguente dimostra che:

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

struct S {} 

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

Questo codice viene compilato, a dimostrazione che new() non importa se si utilizza un riferimento o un tipo di valore.

+2

+1 Dichiarato chiaramente [nella documentazione] (http://msdn.microsoft.com/en-us/library/d5x73970 (v = vs.110) .aspx). –

+0

@AdamHouldsworth IMO anche la documentazione non è chiara. "struct" implica "new()" ma/then "new()" non può essere usato con "struct" (anche se non lo dicono). –

+0

@Adriano 'new' può essere usato con' struct', hanno costruttori. –

1

No, non sono inutili.

Primo parametro classe assicura che l'argomento di tipo deve essere un tipo di riferimento, compresa qualsiasi classe, interfaccia, delegato, o il tipo di matrice,

che secondo parametro nuovo() garantirle un parametro meno costruttore predefinito. Non funzionerà per qualsiasi classe che non ha un costruttore di default di parametri.

Problemi correlati