2013-07-06 19 views
9

Nel seguente codice non so cosa significhi "dove S: nuovo()" parte. Qual è la parola chiave per trovare più informazioni in Google?Cosa significa dove S: nuovo() in C#

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

ricerca per vincoli sui parametri tipo. ecco il link http://msdn.microsoft.com/en-us/library/d5x73970.aspx – qwr

+6

Duplicato di [C# code confusion of where clause] (http://stackoverflow.com/q/5461963), che ho trovato cercando SO per [\ [C# \] generico dove nuovo] (http://stackoverflow.com/search?q=%5Bc%23%5D+generic+where+new). Inoltre, [Cosa fa new() in 'where T: new()'] (http://stackoverflow.com/q/1085434) che SO mostra nella barra laterale Domande correlate. –

risposta

16

Il new() vincolo significa che il parametro generico particolare è richiesto di avere un costruttore di default (i. E. Un costruttore senza parametri).

Lo scopo di questo è in genere quello di consentire di scrivere in modo sicuro nuove istanze di tipi di parametri generici senza ricorrere a reflection/Activator.CreateInstance.

Ad esempio:

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

Per ulteriori informazioni, visitate http://msdn.microsoft.com/en-us/library/sd2w2ew5%28v=vs.80%29.aspx.

Per quanto riguarda il termine di ricerca di Google, proverei "C# new() constraint".

+1

Il nome formale è un vincolo _constructor_, quindi è qualcosa che potresti anche cercare su Google. _Constraint_ è la parola più importante, ovviamente. Nota che se 'T' è un tipo di valore, allora' new T(); 'non chiama un costruttore di istanze reali; costruisce lo stesso valore di 'default (T)', per i tipi di valore. Per questo motivo non è consentito combinare un vincolo di tipo value e un vincolo di costruzione, quindi questo è illegale: 'dove T: struct, new()' (considerato ridondante). Se 'T' è un tipo di riferimento,' default (T) 'fornisce un riferimento' null' mentre 'new T();' chiama un vero costruttore. –

+0

Qualsiasi tipo di valore, inclusi i tipi interi predefiniti e i tipi di enumerazione, soddisfa il vincolo del costruttore. Un tipo di riferimento lo soddisfa se e solo è (non è astratto e) ha un costruttore di istanze a parametro zero ** public *. (Le classi astratte _should_ non hanno costruttori 'public'.) –