58 votes

Que signifie [param: NotNull] en C #?

Dans l'Entity Framework code source (lien), j'ai trouvé cette ligne:

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

L' [param: NotNull] partie semble très étrange pour moi. Toute idée de ce genre de syntaxe C# est-ce? Je suis familier avec les attributs et les param mais pas cette combinaison.

La définition de NotNull est ceci:

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

Qui je m'attendais à être utilisé simplement comme [NotNull] mais qu'est - param fais ici?

61voto

Backs Points 267

Lorsque vous marquez une méthode NotNull cela signifie, que la méthode renvoie pas null objet:

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

Lorsque vous marquez setter il en fait de même - setter renvoie pas null (parce que .net convertit les propriétés de méthodes get et set).

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

Est égal à:

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

Donc, vous avez besoin d'ajouter param: point, que la "je veux dire - paramètre de setter n'est pas nul, pas un résultat de la méthode":

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

Est égal à:

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

41voto

param: est l'attribut cible. Voir: 17.2 spécification d'Attribut

L'attribut cible peut être l'un de ces:

de l'assemblée, un module, un champ, un événement, une méthode, param, de propriété, de retour, de type

Donc, [param: NotNull] signifie que l' NotNullAttribute s'applique à l' value paramètre de l'incubateur. Il est nécessaire de préciser ici, la cible, depuis l' value paramètre n'apparaît pas comme un paramètre d'une méthode explicite.


Une utilisation courante de l'attribut cible est de spécifier l' InternalsVisibleToAttribute afin de rendre les types et les membres déclarés en tant que internal visible de l'unité de projets de test.

[assembly:InternalsVisibleTo("UnitTestProject")]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X