2010-11-21 27 views
13

Esiste una classe AuthenticationBase in Servizi RIA WCF. La definizione della classe è la seguente:Che cosa significa new()?

// assume using System.ServiceModel.DomainServices.Server.ApplicationServices 

public abstract class AuthenticationBase<T> 
    : DomainService, IAuthentication<T> 
    where T : IUser, new() 

Cosa significa "new()" in questo codice?

risposta

21

È il new constraint.

Si specifica che T non deve essere abstract e deve esporre un public senza parametri constructor al fine di essere utilizzato come generic type argument per la classe AuthenticationBase<T>.

+2

Correzione teeny weeny: un tipo deve avere queste caratteristiche per poter essere usato come un tipo generico * argomento * . 'T' è il tipo generico * parametro *, ma il tipo effettivamente utilizzato (ad esempio' object', 'int') è l'argomento type. –

+1

@Jon, debitamente notato, grazie :) –

7

L'utilizzo della parola chiave new() richiede la definizione di un costruttore predefinito per detta classe. Senza la parola chiave, provare a scrivere new() non verrà compilato.

Ad esempio, lo snippet seguente non verrà compilato. La funzione proverà a restituire una nuova istanza del parametro.

public T Foo <T>() 
// Compile error without the next line 
// where T: new() 
{ 
    T newInstance = new T(); 
    return newInstance; 
} 

Questo è un vincolo di tipo generico. Vedi questo MSDN article.

5

Significa che un tipo utilizzato per riempire il parametro generico T deve avere un costruttore pubblico e senza parametri. Se il tipo non implementa tale costruttore, ciò comporterà un errore in fase di compilazione.

Se viene applicato il new() vincolo generico, come in questo esempio, che permette la classe o metodo (classe AuthenticationBase<T> in questo caso) per chiamare new T(); costruire una nuova istanza del tipo specificato. Non c'è altro modo, a meno di riflettere (questo include l'utilizzo di System.Activator, per costruire un nuovo oggetto di tipo generico