Уточнение атрибутов использования MSDN - PullRequest
2 голосов
/ 05 марта 2011

Я с трудом пытаюсь выяснить значение этого совета из Атрибуты использования Guildelines :

Не определять параметр с именованными и позиционными аргументами. Следующий пример кода иллюстрирует этот шаблон.

И код:

public class NameAttribute: Attribute 
{
   string userName;
   int age;

   // This is a positional argument.
   public NameAttribute (string userName) 
   { 
       this.userName = userName;
   }
   public string UserName 
   { 
      get 
      {
         return userName; 
      }
   }
   // This is a named argument.
   public int Age 
   { 
      get 
      {
         return age;
      }
      set 
      {
         age = value;
      }
   } 
}

Теперь, извините, если это действительно просто, и я трачу ваше время. Но я просто не понимаю смысла и того, что демонстрирует пример. Тот факт, что английский не является моим родным языком, может быть фактором, но у меня не было никаких проблем с чтением MSDN раньше. Я также пытался прочитать переведенную версию этой статьи, но для меня это еще менее важно.

Так что, если кто-то будет достаточно любезен, чтобы перефразировать и объяснить это мне, это будет действительно полезно. Если вы также можете объяснить, почему MSDN рекомендует это сделать, я весь в ушах.

Ответы [ 2 ]

4 голосов
/ 05 марта 2011

Подумайте, как бы вам пришлось использовать такой атрибут:

[Name("Jack", Age = 25)]
public class ClassToDecorate { }

Теперь, это не выглядит так ясно, потому что смешиваются два стиля: UserName устанавливается через атрибутконструктор («позиционный»), но Age явно задается как свойство («именованное»).

Указание предполагает, что было бы лучше изменить атрибут так, чтобы точно будет работать одно из следующих украшений:

[Name("Jack", 25)] // Positional only

(или)

[Name(UserName = "Jack", Age = 25)] // Named only
1 голос
/ 05 марта 2011

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

public NameAttribute (string userName, int age) 
{ 
    this.userName = userName;
    this.Age = age;
}

Теперь клиентский код может использовать атрибут следующим образом:

[Name("foo", 42)]

и таким образом:

[Name("foo", Age = 42)]

Оба одинаково действительны, клиентский программист не сможет решить, какой из них выбрать. Гораздо более неприятным примером будет этот конструктор:

public NameAttribute(int age) {
    this.userName = "unspecified";
    this.Age = age;
}

, что позволяет:

[Name(42, Age = 43)]
...