2016-10-15 4 views
2

Я видел этот ответ по этой ссылке Adding parameters to custom attributes, как это добавить параметры в пользовательский атрибутC# Custom Attribute параметры

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

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

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

Теперь мне интересно, если не может это быть писать так, как это?

class MyCustomAttribute : Attribute { 
    private int[] _values; 

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

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

Я изменил свойство Значения в переменной _ значения. Я также сделал это частным, и он отлично работает, когда я попробовал.

Может кто-нибудь просветить меня, почему принятый ответ действительно?

+0

- Вы ничего не опубликовали, чтобы предположить, что это неверно. В лучшем случае вы показали, что работает более одного способа. Итак, почему вы думаете, что что-то не так с ответом, который вы прочитали? – hvd

+0

Задайте себе, что вы можете сделать с вашим пользовательским атрибутом. Подсказка: основная цель атрибутов - не создавать jus. –

ответ

2

Принимаемый ответ использует публичное свойство вместо частного поля. Преимущество публичной собственности заключается в том, что вы можете опустить конструктор и указать значения свойств в конструкторе по умолчанию.

Я изменяю свой первый код, который имеет государственную собственность, на что-то вроде этого.

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

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

Для [MyCustomAttribute(3, 4, 5)] список параметров не указан, поэтому используется конструктор MyCustomAttribute.

Поэтому не имеет значения, если есть общественные объекты Values.

В вашем первом примере кода приемлемо использовать [MyCustomAttribute(3, 4, 5)] и [MyCustom(Values = new[] {3, 4, 5})].

Второй образец кода «только» принимает [MyCustomAttribute(3, 4, 5)].

+0

Вы имели в виду, что «мой код или второй код» также правильный и приемлемый? –

+0

Оба ваших кода являются приемлемыми. См. Образец MSDN в этой [link] (https://msdn.microsoft.com/en-us/library/84c42s56 (v = vs.110) .aspx). Это похоже на ваш второй код. Также см. Мой ответ для варианта вашего первого кода. – Han

+0

@RenanteAbril - Я добавил, что оба образца верны. Единственное различие заключается в том, как обеспечивается целочисленный массив (через конструктор или с помощью средства настройки свойств). –

2

Есть различия, и это все о reflection.

Главным из них является беглость, которую мы получаем - мы могли бы использовать конструктор или свойство 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 
{ 
} 

Другой фактор reflection получить свойство; С Values поле является public, мы могли бы использовать ниже, чтобы получить подробную информацию, но не с private: «Может ли кто-нибудь просветить меня, почему принял ответ действительно»

var data = typeof(MyCustomAttribute).GetProperty("Values"); 
Смежные вопросы