2010-11-21 14 views
13

Hay una clase AuthenticationBase en WCF RIA Services. La definición de clase es el siguiente:¿Qué significa new()?

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

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

¿Qué significa new() en este código?

Respuesta

21

Es el new constraint.

Se especifica que T no debe haber abstract y deben exponer una public sin parámetros constructor con el fin de ser utilizado como un generic type argument para la clase AuthenticationBase<T>.

+2

Corrección Teeny weeny: un tipo debe tener esas características para ser utilizado como un tipo genérico * argumento * . 'T' es el tipo genérico * parámetro *, pero el tipo que se usa realmente (por ejemplo' object', 'int') es el argumento de tipo. –

+1

@Jon, debidamente anotado, gracias :) –

7

El uso de la palabra clave new() requiere que se defina un constructor predeterminado para dicha clase. Sin la palabra clave, intentar compilar new() no se compilará.

Por ejemplo, el siguiente fragmento no se compilará. La función intentará devolver una nueva instancia del parámetro.

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

Esta es una restricción de tipo genérico. Vea esto MSDN article.

5

Significa que un tipo utilizado para rellenar el parámetro genérico T debe tener un constructor público y sin parámetros. Si el tipo no implementa dicho constructor, esto dará como resultado un error en tiempo de compilación.

Si se aplica el new() restricción genérica, como en este ejemplo, que permite a la clase o método (la clase AuthenticationBase<T> en este caso) para llamar new T(); para construir una nueva instancia del tipo especificado. No hay otra manera, salvo la reflexión (esto incluye el uso de System.Activator, para construir un nuevo objeto de tipo genérico.