web-dev-qa-db-de.com

C # -Parameter für benutzerdefinierte Attribute

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?

5
user5002462

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 { }
4
Han

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)].

4
Ralf Bönning

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. 

 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
{
}

Ein weiterer Faktor ist reflection, um die Eigenschaft zu erhalten. Wenn das Feld Valuespublic ist, können wir die Details unten verwenden, um die Details abzurufen, jedoch nicht mit private

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