2010-11-21 9 views
13

Istnieje klasa AuthenticationBase w usługach WCF RIA. Definicja klasy jest następująca:Co oznacza nowy()?

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

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

Co oznacza new() w tym kodzie?

Odpowiedz

21

To jest new constraint.

Określa ona, że ​​T nie musi być abstract i muszą wystawiać public bez parametrów constructor w celu wykorzystania jako generic type argument dla klasy AuthenticationBase<T>.

+2

Korekta weeny weeny: typ musi mieć te cechy, aby mógł być użyty jako rodzajowy * argument * 'T' jest ogólnym typem * parametru *, ale typem, który jest faktycznie używany, (np.' Object', 'int') jest argument typu: –

+1

@Jon, należycie zaznaczone, dzięki :) –

7

Użycie nowego() słowa kluczowego wymaga zdefiniowania domyślnego konstruktora dla tej klasy. Bez słowa kluczowego próba klasy new() nie będzie się kompilować.

Na przykład poniższy fragment nie zostanie skompilowany. Funkcja spróbuje zwrócić nową instancję parametru.

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

Jest to ogólne ograniczenie typu. Zobacz ten MSDN article.

5

Oznacza to, że typ używany do wypełnienia ogólnego parametru T musi mieć publiczny i bez parametrów konstruktor. Jeśli typ nie implementuje takiego konstruktora, spowoduje to błąd podczas kompilacji.

Jeżeli new() rodzajowe ograniczenie stosuje się, jak w tym przykładzie, który pozwala na klasę lub metodę (klasy w tym przypadku AuthenticationBase<T>) w celu wywołania new T(); skonstruować nowe wystąpienie określonego typu. Nie ma innej drogi, bez refleksji (obejmuje to użycie System.Activator, aby skonstruować nowy obiekt typu ogólnego.)