Ich habe diese Antwort aus diesem Link gesehen Hinzufügen von Parametern zu benutzerdefinierten Attributen zum Hinzufügen von Parametern zu benutzerdefinierten Attributen
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(params int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(3, 4, 5)]
class MyClass { }
Jetzt frage ich mich, ob es nicht so schreiben kann?
class MyCustomAttribute : Attribute {
private int[] _values;
public MyCustomAttribute(params int[] values) {
_values = values;
}
}
[MyCustomAttribute(3, 4, 5)]
class MyClass { }
Ich habe die Eigenschaft Values in eine Variable _values. Geändert. Ich habe sie auch als privat deklariert und es funktioniert gut, wenn ich es ausprobierte.
Kann jemand aufklären, warum die akzeptierte Antwort gültig ist?
Die akzeptierte Antwort verwendet die öffentliche Eigenschaft anstelle eines privaten Felds. Der Vorteil einer öffentlichen Eigenschaft ist, dass Sie den Konstruktor weglassen und die Werte der Eigenschaften im Standardkonstruktor angeben können.
Ich ändere deinen ersten Code, den mit öffentlichen Besitz, in so etwas.
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
}
[MyCustomAttribute(Values = new int[] { 3, 4, 5 })]
class MyClass { }
Für [MyCustomAttribute(3, 4, 5)]
ist die Parameterliste unbenannt, daher wird der Konstruktor von MyCustomAttribute
verwendet.
Daher ist es egal, ob es öffentliche Values
-Eigenschaften gibt.
In Ihrem ersten Codebeispiel können Sie [MyCustomAttribute(3, 4, 5)]
und [MyCustom(Values = new[] {3, 4, 5})]
verwenden.
Das zweite Codebeispiel akzeptiert "nur" [MyCustomAttribute(3, 4, 5)]
.
Es gibt Unterschiede, und es geht um reflection
.
Hauptsächlich ist die Fließfähigkeit, die wir bekommen - wir könnten entweder den Konstruktor oder die Values
-Eigenschaft verwenden.
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
{
}
Ein weiterer Faktor ist reflection
, um die Eigenschaft zu erhalten. Wenn das Feld Values
public
ist, können wir die Details unten verwenden, um die Details abzurufen, jedoch nicht mit private
:
var data = typeof(MyCustomAttribute).GetProperty("Values");