pascalabcnet/PABCNetHelp/LangGuide/Classes/attributes.html

57 lines
3.6 KiB
HTML
Raw Permalink Normal View History

<html>
<head>
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="Attribute">
<param name="Keyword" value="Атрибут">
</object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
<link rel="StyleSheet" href="../../default.css">
</head>
<body>
<H1>Атрибуты</H1>
<p>В языке имеется ограниченное число стандартных атрибутов, задаваемых
ключевыми словами - например: атрибуты уровня доступа public, private и
protected, атрибуты static, virtual и override для методов. </p>
<p>Пользовательские атрибуты (далее просто атрибуты) - специальные языковые
конструкции, позволяющие помечать классы, методы, подпрограммы, параметры
некоторым именем (возможно с параметрами).</p>
<p>Например, для механизма сериализации класс помечается атрибутом
[Serializable], а поля, которые не следует сериализовывать, атрибутом
[NonSerialized]. При Unit-тестировании тестовый метод помечается атрибутом
[Test] или атрибутом [TestCase]. Распознаются атрибуты методом отражения
(рефлексии).</p>
<p>Атрибут - это обычный класс, унаследованный от System.Atribute. Например: </p>
<blockquote>
<p><code><b>type </b>AuthorAttribute = <strong>class</strong>(System.Attribute)<br>&nbsp;
<strong>auto</strong> property Name: string;<br>&nbsp; <strong>constructor</strong> (n: string);<br>&nbsp;
<strong>begin</strong><br>&nbsp;&nbsp;&nbsp; Name := n;<br>&nbsp; <strong>end</strong>;&nbsp; <strong><br>end</strong>;</code></p>
</blockquote>
<p>Следует обратить внимание, что класс атрибута принято оканчивать на <code>
Attribute</code>.</p>
<p>При пометке сущности атрибутом имя атрибута заключается в квадратные скобки. Конструктор атрибута предоставляет
также возможность использовать атрибуты с
параметрами. Например, можно пометить класс
атрибутом <code>AuthorAttribute</code>. </p>
<blockquote>
<p><code>[Author('Alex')]<b><br>type </b>My = <strong>class</strong><br>&nbsp; // ...<strong><br>
end</strong>;</code></p>
</blockquote>
<p>Следует обратить внимание, что окончание <code>Attribute</code> можно не
указывать.</p>
<p>Распознать, помечен ли данный класс атрибутом, можно, используя
анализ типа: </p>
<blockquote>
<p><code><strong>begin</strong> <br>&nbsp; <strong>var</strong> t := typeof(My);
<br>&nbsp; <strong>var</strong> attrs := t.GetCustomAttributes(false); <br>&nbsp;
<strong>foreach</strong> <strong>var</strong> attr <strong>in</strong> attrs
<strong>do</strong> <br>&nbsp;&nbsp;&nbsp; <strong>if</strong> attr <strong>is</strong> AuthorAttribute (<strong>var</strong> auth)
<strong>then</strong> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print(auth.Name);
<br><strong>end</strong>.</code></p>
</blockquote>
<p>&nbsp;</p>
</body>
</html>