Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
// CustomAttribute Type: 06000005// CustomAttributeName: AttributedCarLibrary.VehicleDescriptionAttribute :: instance void .ctor(class System.String)// Length: 45// Value : 01 00 28 41 20 76 65 72 79 20 6c 6f 6e 67 2c 20 > (A very long, <// : 73 6c 6f 77 2c 20 62 75 74 20 66 65 61 74 75 72 >slow, but feature<// : 65 2d 72 69 63 68 20 61 75 74 6f 00 00 >e-rich auto <// ctor args: ("A very long, slow, but feature-rich auto")Ограничение использования атрибутов
По умолчанию специальные атрибуты могут быть применены практически к любому аспекту кода (методам, классам, свойствам и т.д.). Таким образом, если бы это имело смысл, то
VehicleDescription[VehicleDescription("A very long, slow, but feature-rich auto")]public class Winnebago{ [VehicleDescription("My rocking CD player")] public void PlayMusic(bool On) { ... }}В одних случаях такое поведение является точно таким, какое требуется, но в других может возникнуть желание создать специальный атрибут, применяемый только к избранным элементам кода. Чтобы ограничить область действия специального атрибута, понадобится добавить к его определению атрибут
[AttributeUsage]AttributeTargets// Это перечисление определяет возможные целевые элементы для атрибута.public enum AttributeTargets{ All, Assembly, Class, Constructor, Delegate, Enum, Event, Field, GenericParameter, Interface, Method, Module, Parameter, Property, ReturnValue, Struct}Кроме того, атрибут
[AttributeUsage]AllowMultiplefalse[AttributeUsage]InheritedtrueМодифицируйте определение
VehicleDescriptionAttribute[VehicleDescription]// На этот раз для аннотирования специального атрибута// используется атрибут AttributeUsage.[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = false)]public sealed class VehicleDescriptionAttribute : System.Attribute{ ...}Теперь если разработчик попытается применить атрибут
[VehicleDescription]Атрибуты уровня сборки
Атрибуты можно также применять ко всем типам внутри отдельной сборки, используя дескриптор
[assembly:]AssemblyAttributes.csAssemblyInfо.csНа заметку! Какая-либо формальная причина для использования отдельного файла отсутствует; это связано чисто с удобством поддержки вашего кода. Помещение атрибутов сборки в отдельный файл проясняет тот факт, что в вашем проекте используются атрибуты уровня сборки, и показывает, где они находятся.
При добавлении в проект атрибутов уровня сборки или модуля имеет смысл придерживаться следующей рекомендуемой схемы для файла кода:
// Первыми перечислить операторы using.using System;// Теперь перечислить атрибуты уровня сборки или модуля.// Обеспечить совместимость с CLS для всех открытых типов в данной сборке.[assembly: CLSCompliant(true)]Если теперь добавить фрагмент кода, выходящий за рамки спецификации CLS (вроде открытого элемента данных без знака), тогда компилятор выдаст предупреждение:
// Тип ulong не соответствует спецификации CLS.public class Winnebago{ public ulong notCompliant;}На заметку! В .NET Core внесены два значительных изменения. Первое касается того, что файл
AssemblyInfo.csVersionCompanyИспользование файла проекта для атрибутов сборки
Как было демонстрировалось в главе 16 с классом
InternalsVisibleToAttributeПохожие книги на "Язык программирования C#9 и платформа .NET5", Троелсен Эндрю
Троелсен Эндрю читать все книги автора по порядку
Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mir-knigi.info.