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?
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 { }
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)]
.
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
.
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");