Атрибуты, просто метаданные или нужны? - PullRequest
2 голосов
/ 12 мая 2011

Несколько дней назад я спросил, что означает этот атрибут:

 [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]  public unsafe static extern bool ZeroMemory(byte* destination, int length); 

Я узнал, что атрибуты являются метаданными, но я не понимаю, нужно ли это в этом случае? Я думал, что метада - это просто метаданные, которые можно опустить. Также код, кажется, работает нормально, когда я удаляю attibute. Я хотел бы понять.

PS: Ханс Пассант упомянул о том, что он описан в любой книге о .NET Csharp. Это не так, широко используемая версия VS 2010 от Джона Шарпа не распространяется.

Ответы [ 5 ]

2 голосов
/ 12 мая 2011

Метаданные обычно имеют причину и значение.В этом конкретном случае он сообщает компилятору, как привязать это определение внешнего метода (например, к какому импорту DLL он соответствует).

Другие атрибуты определяют, как взаимодействие выполняется платформой, а другие управляют отображением инспектора объектов.данные.Сторонние атрибуты также широко используются для управления различными видами поведения, например, для поиска информации определенного типа при выполнении отражения.

1 голос
/ 12 мая 2011

Нет, этот атрибут абсолютно обязателен. Он сообщает CLR, что то, что вы определили, на самом деле использует сервисы вызова платформы (или P / Invoke) для вызова функции, определенной в неуправляемом коде.

В частности, функция RtlZeroMemory, определенная в библиотеке kernel32.dll.

Без этого компилятор не знал бы, к какой функции он привязан, а CLR не знал бы, какую функцию вызывать во время выполнения.

1 голос
/ 12 мая 2011

Этот атрибут выполняет 2 вещи

  • Сообщает CLR, что вызываемый метод C находится в kernel32.dll
  • Сообщает CLR, что имя метода C является RtlZeroMemory, а неZeroMemory, как он назван в коде.

Да, этот атрибут необходим на 100%.Для любого метода PInvoke необходимо как минимум назвать библиотеку DLL, в которой находится метод C.

0 голосов
/ 12 мая 2011

Как показывает ваш пример, атрибуты действительно необходимы в нескольких ключевых областях программирования .NET.

Атрибуты предоставляют модель, известную как «Аспектно-ориентированное программирование» или AOP. Вместо того чтобы писать код, выполняющий какую-то конкретную задачу, такую ​​как сериализация, взаимодействие с DLL, ведение журнала и т. Д., Вы можете просто декорировать классы или члены, для которых вы хотите, чтобы эти задачи выполнялись с помощью атрибута. Атрибуты - это особый тип класса, члены которого могут вызываться CLR при выполнении кода, который будет выполнять ту задачу, которую вы хотели при оформлении кода.

Вы правы частично; многие атрибуты предназначены просто для хранения метаданных. Описание Атрибут хороший. Однако даже в этом случае атрибут важен в зависимости от того, как он используется. Если вы украшаете член класса GUI, который хотите использовать в конструкторе, [Description ()] предоставляет ценную информацию пользователю класса в конструкторе, которым может быть не вы. Я также видел и использовал много альтернативных вариантов использования DescriptionAttribute; его можно применять практически ко всему, поэтому я использовал его для предоставления «дружественных имен» для констант Enum в сочетании с методом расширения GetDescription () для их получения при использовании Enums для заполнения раскрывающихся списков.

Итак, хотя это технически «метаданные», атрибут «требуется» определяется тем, насколько вы хотите, чтобы выполнялась задача, присущая этому атрибуту.

0 голосов
/ 12 мая 2011

Что касается этого конкретного атрибута, я не слишком уверен.Честно говоря, я никогда не видел его почти год постоянной C #.

Однако атрибуты в целом могут оказаться очень полезными.Например, у меня были проблемы с дизайнером VS2010, который устанавливал свойства автозаполнения в неправильном порядке и в результате получал ошибки во время выполнения.Решением было добавить атрибуты к свойствам автозаполнения, которые не позволяли конструктору записать эти свойства в файл дизайна, и вместо этого установить сами свойства в файле .cs (в правильном порядке).

Сводка: атрибуты(обычно) не требуется , но может оказаться чрезвычайно полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...