Разработка компиляторов

       

Атрибуты


При написании программ очень часто возникает потребность в записи какой-то важной информации о программе или ее отдельных компонентах. Например, программисту может понадобиться определить новые свойства для создаваемых им объектов или явно указать, требуется ли наличие транзакции. При этом невозможно заранее предугадать все возможные виды информации, которые могут потребоваться, и потому язык должен предоставлять программисту возможность создания новых типов информации, привязки их к объектам программы и средства для работы с ними.

Традиционным решением этой задачи была запись информации подобного рода в специальных файлах (например, .IDL или .DEF). В С# для этой цели используются атрибуты , которые представляют собой "примечания" к элементам исходного текста программы (классам, методам, параметрам методов и т.д.). В отличие от комментариев, информация, записанная в атрибутах, не теряется во время компиляции, а сохраняется в метаданных программы и может быть извлечена с помощью механизма рефлексии (подробнее об этом - в лекции 14).

Существует целый ряд системных атрибутов , отражающих наиболее распространенные случаи использования сторонней информации. Приведем такой пример:

using System.Runtime.InteropServices; public class AppMain { [DllImport("user32.dll")] public static extern int MessageBoxA(int handle, string message, string caption,int flags); public static void Main(){ MessageBoxA(0, "Hello World", "Native Message Box",0); } [conditional("DEBUG")] public static void SayHello() { Console.WriteLine("Hello, World! "); return; } }

В этом примере используется атрибут DllImport , с помощью которого обеспечивается взаимодействие с функцией MessageBoxA из Win32 API, а затем используется атрибут conditional , который эквивалентен записи #if DEBUG . Если идентификатор DEBUG не определен, то и определения, и вызовы метода SayHello будут удаляться.



Содержание раздела