2015-09-11 14 views
54

W kodzie źródłowym Entity Framework (link) znalazłem ten wiersz:Co oznacza [param: NotNull] w C#?

public virtual IRelationalTransaction Transaction 
{ get; [param: NotNull] protected set; } 

[param: NotNull] część wygląda bardzo dziwne dla mnie. Każdy pomysł, jaki rodzaj składni C# jest to? Jestem zaznajomiony z atrybutami i paramem, ale nie z tą kombinacją.

Definicja NotNull to:

[AttributeUsage(
    AttributeTargets.Method | AttributeTargets.Parameter | 
    AttributeTargets.Property | AttributeTargets.Delegate | 
    AttributeTargets.Field)] 
internal sealed class NotNullAttribute : Attribute 
{ 
} 

Jakie spodziewałem się być używane tylko jako [NotNull] ale co param tu robi?

Odpowiedz

56

Po oznaczeniu metodą z NotNull oznacza to, że metoda zwraca NULL obiekt:

[NotNull] 
public object Get() 
{ 
    return null; //error 
} 

Po zaznaczeniu seter to robi to samo - seter zwraca niezerowy (bo .net przekształca własności do pobierania i ustawiania metody).

public virtual IRelationalTransaction Transaction { get; [NotNull] protected set; } 

Równa się:

[NotNull] 
public virtual void set_Transaction(IRelationalTransaction value) { ... } 

Więc trzeba dodać param: do punktu, że "mam na myśli - parametr seter nie jest zerowa, a nie wynikiem metody SET":

public virtual IRelationalTransaction Transaction { get; [param: NotNull] protected set; } 

Równa się:

public virtual void set_Transaction([NotNull] IRelationalTransaction value) { ... } 
+2

Ustawodawca nie zwraca wartości. co masz na myśli przez "setter zwraca zero" w odpowiedzi na pytanie: –

+7

@HakamFostok stroingly, zwraca 'Void', i możesz oznaczyć dowolną metodę z' NotNull', nawet jeśli zwraca "nic" (void). – Backs

+0

Czy generowana metoda ustawiająca nie jest "chroniona"? – chi

38

param: to cel atrybutu. Zobacz: 17.2 Attribute specification

docelowy atrybut może być jedną z nich:

montaż modułu, pola, impreza, metoda, param, nieruchomości, zwrot, typ

Więc [param: NotNull] oznacza, że NotNullAttribute odnosi się do parametru setter z value. Konieczne jest tutaj określenie celu, ponieważ parametr value nie jest jawnie wyświetlany jako parametr metody.


Wspólne korzystanie z atrybut target jest określenie InternalsVisibleToAttribute w celu uczynienia typów i członków zadeklarowane jako internal widzialnego do projektów badawczych jednostkowych.

[assembly:InternalsVisibleTo("UnitTestProject")] 

Zespół nie pojawia się jako konstruktu języka, dlatego atrybut target assembly jest jedynym sposobem, aby określić atrybut dla zespołu. Btw: Można to określić w dowolnym pliku kodu źródłowego.

+4

Myślę, że to miała być akceptowana odpowiedź, ale tak czy inaczej. – Tarik

+0

Czy istnieje wersja tego łącza do czegoś nowszego niż .NET 1.1? –

+0

Niestety, specyfikacja języka C# (https://msdn.microsoft.com/en-us/library/ms228593.aspx) jest dostępna tylko do pobrania, więc nie mogę podać bezpośredniego linku. –