web-dev-qa-db-fra.com

Paramètres d'attribut personnalisé C #

J'ai vu cette réponse de ce lien Ajout de paramètres à des attributs personnalisés de comment ajouter des paramètres à un attribut personnalisé 

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

    public MyCustomAttribute(params int[] values) {
       this.Values = values;
    }
}

[MyCustomAttribute(3, 4, 5)]
class MyClass { }

Maintenant, je me demande si ça ne peut pas être écrit comme ça?

class MyCustomAttribute : Attribute {
    private int[] _values;

    public MyCustomAttribute(params int[] values) {
       _values = values;
    }
}

[MyCustomAttribute(3, 4, 5)]
class MyClass { }

J'ai changé la propriété Values ​​en une variable _values ​​. Je l'ai également rendue privée et cela fonctionne bien lorsque je l'ai essayée.

Quelqu'un peut-il m'éclairer sur la validité de la réponse acceptée?

5
user5002462

La réponse acceptée utilise la propriété publique au lieu d'un champ privé. L'avantage d'une propriété publique est que vous pouvez omettre le constructeur et fournir les valeurs des propriétés dans le constructeur par défaut.

Je change votre premier code, celui avec la propriété publique, en quelque chose comme ceci.

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }
}

[MyCustomAttribute(Values = new int[] { 3, 4, 5 })]
class MyClass { }
4
Han

Pour [MyCustomAttribute(3, 4, 5)], la liste de paramètres n'a pas de nom, le constructeur de MyCustomAttribute est donc utilisé. 

Par conséquent, peu importe s'il existe une propriété publique Values.

Dans votre premier exemple de code, il est acceptable d'utiliser [MyCustomAttribute(3, 4, 5)] et [MyCustom(Values = new[] {3, 4, 5})].

Le deuxième exemple de code "seulement" accepte [MyCustomAttribute(3, 4, 5)].

4
Ralf Bönning

Il y a des différences et tout dépend de reflection

La principale d'entre elles est la fluidité que nous obtenons - nous pourrions utiliser le constructeur ou la propriété Values

 enter image description here

public class MyCustomAttribute : Attribute
{
    public int[] Values { get; set; } = new int[] { 1, 2, 3 };

    public MyCustomAttribute(params int[] values)
    {
        this.Values = values;
    }
}

[MyCustom(1, 2, 3)]
class MyClass
{

}

[MyCustom(Values = new int[] { 1, 2, 3})]
public class MyAnotherClass
{
}

Un autre facteur est reflection pour obtenir la propriété; Le champ Values étant public, nous pourrions utiliser le texte ci-dessous pour obtenir les détails, mais pas avec private

var data = typeof(MyCustomAttribute).GetProperty("Values");
1
Lijo Joseph