Атрибуты в C # - PullRequest
       25

Атрибуты в C #

36 голосов
/ 07 апреля 2009

Я знаю, что C # (и .NET в целом) хорош в атрибутах. Однако, несмотря на то, что я программировал на C # в течение многих лет, я никогда не использовал их. Кто-нибудь поможет мне начать с них и объяснит, где их лучше всего использовать?

Спасибо

Ответы [ 8 ]

33 голосов
/ 07 апреля 2009

Из Pro C # 2008 и платформы .NET 3.5, четвертое издание Эндрю Троелсена

Понимание атрибутного программирования

Одной из функций компилятора .NET является генерация метаданных. описания для всех определенных и ссылочных типов. В дополнение к этим стандартным метаданным содержится В любой сборке платформа .NET позволяет программистам вставлять дополнительные метаданные в сборку с использованием атрибутов. В двух словах, атрибуты - это не более чем код аннотации, которые могут быть применены к данному типу (класс, интерфейс, структура и т. д.), член (свойство, метод и т. д.), сборка или модуль. Идея аннотирования кода с использованием атрибутов не нова. COM IDL предоставил множество предопределенных атрибуты, которые позволяли разработчикам описывать типы, содержащиеся в данном COM-сервере. Тем не менее, атрибуты COM были немного больше, чем набор ключевых слов. Если разработчик COM необходимо создать пользовательский атрибут, он или она могли бы сделать это, но на него в коде ссылается 128-битное число (GUID), который был в лучшем случае громоздким. В отличие от атрибутов COM IDL (которые опять-таки были просто ключевыми словами), атрибуты .NET являются типами классов которые расширяют абстрактный базовый класс System.Attribute. По мере изучения пространств имен .NET вы будете найдите много предопределенных атрибутов, которые вы можете использовать в своих приложениях. Более того, вы можете создавать собственные атрибуты для дальнейшей оценки поведения ваших типов путем создания новый тип, производный от атрибута. Следует понимать, что когда вы применяете атрибуты в своем коде, встроенные метаданные по существу бесполезен, пока другая часть программного обеспечения явно не отражает информацию. Если это не так, всплеск метаданных, встроенных в сборку, полностью игнорируется.

Атрибут Потребители

Как вы могли догадаться, .NET 3.5 Framework SDK поставляется с множеством утилит, которые действительно включены поиск различных атрибутов. Сам компилятор C # (csc.exe) был предварительно запрограммирован на обнаружить наличие различных атрибутов во время цикла компиляции. Например, если C # Компилятор встречает атрибут [CLSCompliant], он автоматически проверит приписанный элемент убедитесь, что он предоставляет только CLS-совместимые конструкции. В качестве другого примера, если компилятор C # обнаруживает элемент, связанный с атрибутом [устаревший], он отображает предупреждение компилятора в Окно списка ошибок Visual Studio 2008 В дополнение к инструментам разработки, предварительно запрограммированы многочисленные методы в библиотеках базовых классов .NET размышлять над конкретными атрибутами. Например, если вы хотите сохранить состояние объект в файл, все, что вам нужно сделать, это аннотировать ваш класс с помощью атрибута [Serializable]. Если метод Serialize () класса BinaryFormatter встречает этот атрибут, объект автоматически сохраняется в файл в компактном двоичном формате. .NET CLR также находится в поиске наличия определенных атрибутов. Пожалуй самый известным атрибутом .NET является [WebMethod]. Если вы хотите выставить метод через HTTP-запросы и автоматически закодируйте возвращаемое значение метода как XML, просто примените [WebMethod] к методу и CLR обрабатывает детали. Помимо разработки веб-сервисов, атрибуты имеют решающее значение для работы система безопасности .NET, Windows Communication Foundation и совместимость COM / .NET (и так далее). Наконец, вы можете создавать приложения, которые запрограммированы на отражение ваших собственных пользовательских атрибуты, а также любой атрибут в библиотеках базовых классов .NET. Тем самым вы по сути возможность создавать набор «ключевых слов», понятных определенному набору сборок.

Применение атрибутов в C #

Библиотека базовых классов .NET предоставляет ряд атрибутов в различных Пространства имен. Ниже приведен снимок некоторых, но отнюдь не всех, предопределенных атрибутов.

Крошечная выборка предопределенных атрибутов

[CLSCompliant]

Enпринуждает аннотированный элемент соответствовать правилам Общего Спецификация языка (CLS). Напомним, что CLS-совместимые типы гарантированно будет использоваться на всех языках программирования .NET.

[DllImport]

Позволяет коду .NET выполнять вызовы к любому неуправляемому коду на C или C ++ библиотека, в том числе API базовой операционной системы. Обратите внимание, что [DllImport] не используется при обмене данными с программным обеспечением на основе COM.

[Устаревшее]

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

[Сериализуемый]

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

[NonSerialized]

Указывает, что данное поле в классе или структуре не должно сохраняться в процессе сериализации.

[WebMethod]

Помечает метод как вызываемый через HTTP-запросы и инструктирует CLR сериализировать возвращаемое значение метода как XML.

Создание пользовательских атрибутов

Первым шагом в создании пользовательского атрибута является создание нового класса, производного от System.Attribute. Пример:

// A custom attribute.
public sealed class VehicleDescriptionAttribute : System.Attribute
{
    private string msgData;

    public VehicleDescriptionAttribute(string description)
    {
        msgData = description;
    }

    public VehicleDescriptionAttribute() { }

    public string Description
    {
        get { return msgData; }
        set { msgData = value; }
    }
}

Как видите, VehicleDescriptionAttribute поддерживает частную внутреннюю строку (msgData) это можно установить с помощью пользовательского конструктора и манипулировать с помощью свойства type (описание). Помимо того факта, что этот класс является производным от System.Attribute, в этом классе нет ничего уникального определение.

В целях безопасности считается, что в .NET рекомендуется разрабатывать все пользовательские атрибуты как закрытые. В Фактически, Visual Studio 2008 предоставляет фрагмент кода с именем Attribute, который выводит новую систему. Производный от атрибута класс в вашем окне кода.

7 голосов
/ 07 апреля 2009

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

Например, вы можете использовать атрибуты для импорта библиотеки DLL, указать, как типы будут взаимодействовать с Visual Studio (видимый дизайнер, помощь в intellisense, пошаговый отладчик и т. Д.), Как их сериализовать, указать, что тип устарел, описать значения по умолчанию, описания, доступ к COM и т. д.

Это вещи, которые в значительной степени невидимы для конечного пользователя и которые один программист может поместить в другое место исходного кода. Но они полезны, когда доступен только скомпилированный двоичный файл, а не источник.

4 голосов
/ 07 апреля 2009

Мне нравится использовать атрибуты в качестве метаданных для моего кода. Мы создали несколько простых атрибутов, которые позволяют нам указывать, кто написал, какой код, когда и почему. Это позволяет нам задокументировать изменения в коде и во время выполнения. Если есть какие-либо исключения во время выполнения, мы можем проверить callstack, посмотреть на любые атрибуты методов по пути и отыскать ответственных за это людей:

[Author("Erich", "2009/04/06", Comment = "blah blah blah")]
public void MyFunction()
{
...
}

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

2 голосов
/ 07 апреля 2009

Атрибуты - это форма декларативного программирования, «похожая» на создание вашего пользовательского интерфейса в XAML. Он «помечает» фрагменты кода (классы, методы, свойства и т. Д.) Атрибутом, чтобы впоследствии вы могли собрать все эти фрагменты, помеченные определенным образом, а затем сделать что-то стандартное со всеми ними.

Например. Рассмотрим сценарий, в котором у вас есть определенные разделы кода, которые вы хотите запускать один раз при каждом запуске приложения. В одной модели программирования (без атрибутов) вы переходите к своему основному методу и явно вызываете эти методы init. С помощью атрибутов вы просто собираете все методы, помеченные вашим атрибутом 'init', и вызываете их с помощью отражения.

То же самое относится к таким действиям, как сериализация, постоянство и еще много чего ...

1 голос
/ 08 апреля 2009

Я использую атрибуты для следующего:

  • Связь с подключаемой архитектурой
  • Указание другому фреймворку, что делать с кодом (например, NUnit)
  • Добавление метаданных для использования с другим кодом (см. PropertyGrid)
  • Отображение объектов в базы данных (см. Замок ActiveRecord)
  • При написании собственных API-интерфейсов, позволяющих пользователям обмениваться метаданными
  • В коде фреймворка, чтобы отладчик пропустил его

Это с моей головы. Я использую их во многих других местах

1 голос
/ 07 апреля 2009

Я полагаю, вы имеете в виду, что вы не используете (или часто используете) пользовательские атрибуты?

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

Это инструмент / цель, чтобы добраться до данного решения.

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

В моем текущем проекте я также использую атрибуты для украшения определенных типов дополнительной информацией ... Но я думаю, что я уже писал об этом здесь раньше: Классное использование атрибутов или аннотаций (CLR или Java)?

0 голосов
/ 04 января 2017

Определение атрибута класса доступно здесь

ClassInterfaceAttribute : указывает тип интерфейса класса, который должен быть создан для класса, доступного для COM, если интерфейс вообще создается.

ComDefaultInterfaceAttribute : Указывает интерфейс по умолчанию для предоставления COM. Этот класс не может быть унаследован.

ComVisibleAttribute : Управляет доступом отдельного управляемого типа или элемента или всех типов в сборке к COM.

0 голосов
/ 07 апреля 2009

Атрибуты очень хороши для описания поведения вашего кода во время выполнения, которое ортогонально рассматриваемому коду. Например, в классе Customer вы бы смоделировали клиента, верно? Но вы можете не захотеть моделировать или описывать способ сериализации объекта Customer.

Добавление атрибутов в ваш класс Customer позволяет вам сообщить какой-то другой части среды выполнения, как она должна обращаться с вашим клиентом.

MSTest и NUnit используют атрибуты, чтобы сообщать тестовой среде, как она должна использовать классы, определяющие тестовые фикстуры.

ASP.NET MVC использует атрибут, чтобы сообщить инфраструктуре mvc, какие методы в классах он должен рассматривать как действия контроллера.

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

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