Я знаю, что атрибуты чрезвычайно полезны. Есть несколько предопределенных, например, [Browsable(false)]
которые позволяют скрывать свойства на вкладке свойств. Вот хороший вопрос, объясняющий атрибуты: что такое атрибуты в .NET?
Какие предопределенные атрибуты (и их пространство имен) вы фактически используете в своих проектах?
c#
.net
.net-attributes
Wusher
источник
источник
Ответы:
[DebuggerDisplay]
может быть действительно полезным, чтобы быстро увидеть настроенный вывод Type при наведении указателя мыши на экземпляр Type во время отладки. пример:Вот как это должно выглядеть в отладчике:
Также стоит упомянуть, что
[WebMethod]
атрибут сCacheDuration
набором свойств может избежать ненужного выполнения метода веб-службы.источник
System.Obsolete
это один из самых полезных атрибутов в рамках, на мой взгляд. Возможность выдавать предупреждение о коде, который больше не должен использоваться, очень полезна. Мне нравится иметь возможность сказать разработчикам, что что-то больше не должно использоваться, а также способ объяснить, почему и указать на лучший / новый способ сделать что-то.Это
Conditional attribute
очень удобно для отладки. Это позволяет вам добавлять методы в ваш код для целей отладки, которые не будут компилироваться при сборке вашего решения для выпуска.Кроме того, есть много атрибутов, специфичных для веб-элементов управления, которые я считаю полезными, но они более специфичны и не имеют никакого применения вне разработки серверных элементов управления из того, что я обнаружил.
источник
[Flags]
довольно удобно Синтаксический сахар, конечно, но все же довольно приятный.Leppie указует, что - то я не понял, и который скорее гасит мой энтузиазм для этого атрибута: он делает не инструктирует компилятор , чтобы битовые комбинации как допустимые значения для перечисления переменных, компилятор позволяет это для перечислений независимо. Мой C ++ фон показывает через ... вздох
источник
[Flags]
действительно имеет большее применение, чем просто синтаксический сахар. При использовании веб-сервисов сериализация / десериализация не будет работать, еслиSandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jam
передано значение наподобие . Без[Flags]
атрибута десериализатор не будет знать, что значение может быть комбинацией флагов. Узнал об этом нелегко, потратив около двух дней на размышления о том, почему мой WCF не работает.Мне нравится
[DebuggerStepThrough]
из System.Diagnostics .Это очень удобно для того, чтобы не заходить в эти однострочные ничего не используемые методы или свойства (если вы вынуждены работать в ранних версиях .Net без автоматических свойств). Поместите атрибут в короткий метод или метод получения или установки свойства, и вы будете лететь прямо, даже когда нажмете «шаг в» в отладчике.
источник
Для чего это стоит, вот список всех атрибутов .NET . Есть несколько сотен.
Я не знаю ни о ком другом, но у меня есть серьезные RTFM, чтобы сделать!
источник
Мой голос будет за
Conditional
Вы можете использовать это, чтобы добавить функцию с расширенными функциями отладки; например
Debug.Write
, он вызывается только в отладочных сборках и поэтому позволяет инкапсулировать сложную логику отладки вне основного потока вашей программы.источник
Я всегда использую
DisplayName
,Description
иDefaultValue
атрибуты через общедоступные свойства моих пользовательских элементов управления, пользовательские элементы управления или любого класса , я буду редактировать через сетку свойств. Эти теги используются .NET PropertyGrid для форматирования имени, панели описания и значений, выделенных жирным шрифтом, для которых не установлены значения по умолчанию.Я просто хотел бы, чтобы IntelliSense Visual Studio учитывал
Description
атрибут, если не найден комментарий XML. Это позволит избежать повторения одного и того же предложения дважды.источник
Description
пока вы .. Это наиболее полезно для меня, когда используется с перечислениями ..[Serializable]
используется все время для сериализации и десериализации объектов в и из внешних источников данных, таких как xml или с удаленного сервера. Подробнее об этом здесь.источник
В духе Хофштадта, этот
[Attribute]
атрибут очень полезен, поскольку он позволяет создавать свои собственные атрибуты. Я использовал атрибуты вместо интерфейсов для реализации систем плагинов, добавления описаний в Enums, имитации множества рассылок и других трюков.источник
Вот пост об интересном атрибуте InternalsVisibleTo . В основном то, что он делает, имитирует функциональность доступа друзей C ++. Это очень удобно для модульного тестирования.
источник
internal
которое не является публичным. Он является общедоступным в тестируемой сборке и должен подвергаться модульному тестированию, чтобы другие классы в сборке могли предполагать, что это исправление. Если вы не тестируете его модулем, вам придется тестировать его функции во всех потребляющих классах.Я обнаружил,
[DefaultValue]
что это очень полезно.источник
Я бы предложил
[TestFixture]
и[Test]
- от nUnit библиотеки .Модульные тесты в вашем коде обеспечивают безопасность при рефакторинге и кодированной документации.
источник
поскольку это позволяет вам игнорировать (в любой xml-сериализации) «родительские» объекты, которые в противном случае вызывали бы исключения при сохранении.
источник
Он не имеет правильного имени, не поддерживается в фреймворке и не должен требовать параметра, но этот атрибут является полезным маркером для неизменяемых классов:
источник
ImmutableObjectAttribute
класс - по крайней мере, вы могли бы исключить параметр.Мне нравится использовать
[ThreadStatic]
атрибут в сочетании с программированием на основе потоков и стеков. Например, если я хочу значение, которым я хочу поделиться с остальной частью последовательности вызовов, но я хочу сделать это вне диапазона (то есть вне параметров вызова), я мог бы использовать что-то вроде этого.Позже в моем коде я могу использовать это для предоставления контекстной информации сторонним пользователям моего кода. Пример:
Атрибут ThreadStatic позволяет мне охватить вызов только рассматриваемым потоком, избегая беспорядочной проблемы доступа к данным через потоки.
источник
MyContextInformation.Current
к активному контексту в стеке. В некоторых случаях это очень хорошая концепция, наша (моя компания) система использует ее для многих целей.DebuggerHiddenAttribute , который позволяет избежать шага в код , который не должен быть отлажен.
Также он не позволяет отображать методы в трассировке стека, что полезно при наличии метода, который просто оборачивает другой метод:
Если вы теперь вызываете,
GetElementAt(new Vector2(10, 10))
и в упакованном методе возникает ошибка, стек вызовов не показывает метод, который вызывает метод, который выдает ошибку.источник
DesignerSerializationVisibilityAttribute
это очень полезно. Когда вы помещаете свойство времени выполнения в элемент управления или компонент и не хотите, чтобы дизайнер сериализовал его, вы используете его следующим образом:источник
[Browsable(false)]
требуется скрыть его от пользователя дизайнера, где[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
это необходимо, чтобы его не сериализовали.Только несколько атрибутов получают поддержку компилятора, но одно очень интересное использование атрибутов в AOP: PostSharp использует ваши собственные атрибуты для внедрения IL в методы, позволяя использовать всевозможные возможности ... log / trace - тривиальные примеры - но некоторые другие хорошие примеры такие вещи, как автоматическая реализация INotifyPropertyChanged ( здесь ).
Некоторые из них возникают непосредственно и влияют на компилятор или среду выполнения :
[Conditional("FOO")]
- вызовы этого метода (включая оценку аргумента) происходят, только если во время сборки определен символ «FOO»[MethodImpl(...)]
- используется для обозначения нескольких вещей, таких как синхронизация, встраивание[PrincipalPermission(...)]
- используется для автоматической проверки безопасности кода[TypeForwardedTo(...)]
- используется для перемещения типов между сборками без перестройки вызывающихДля вещей, которые проверяются вручную с помощью отражения - я большой поклонник
System.ComponentModel
атрибутов; такие вещи, как[TypeDescriptionProvider(...)]
,[TypeConverter(...)]
и[Editor(...)]
которые могут полностью изменить поведение типов в сценариях привязки данных (например, динамические свойства и т. д.).источник
Если бы мне пришлось сканировать покрытие кода, я думаю, что эти два были бы лучшими:
источник
Я использовал в
[DataObjectMethod]
последнее время. Он описывает метод, чтобы вы могли использовать свой класс с ObjectDataSource (или другими элементами управления).Больше информации
источник
В нашем текущем проекте мы используем
Он контролирует доступ отдельного управляемого типа или члена или всех типов в сборке к COM.
Больше информации
источник
Говорит конструктору расширить свойства, которые являются классами (вашего контроля)
Указывает инструментам запутывания выполнять указанные действия для сборки, типа или элемента. (Хотя обычно вы используете уровень сборки
[assembly:ObfuscateAssemblyAttribute(true)]
источник
Атрибуты, которые я использую чаще всего, относятся к сериализации XML.
XmlRoot
XmlElement
XmlAttribute
так далее...
Чрезвычайно полезно при выполнении любого быстрого и грязного анализа или сериализации XML.
источник
Мне нравится быть разработчиком среднего уровня
System.ComponentModel.EditorBrowsableAttribute
Позволяет мне скрывать свойства, чтобы разработчик пользовательского интерфейса не был перегружен свойствами, которые им не нужно видеть.System.ComponentModel.BindableAttribute
Некоторые вещи не должны быть привязаны к данным. Опять же, уменьшает работу, которую должны делать разработчики пользовательского интерфейса.Мне также нравится то,
DefaultValue
что упомянул Лоуренс Джонстон.System.ComponentModel.BrowsableAttribute
иFlags
используются регулярно.Я использую,
System.STAThreadAttribute System.ThreadStaticAttribute
когда это необходимо.Кстати. Я так же ценен для всех разработчиков .Net Framework.
источник
[EditorBrowsable(EditorBrowsableState.Never)]
позволяет скрыть свойства и методы от IntelliSense, если проект не входит в ваше решение. Очень полезно для сокрытия неверных потоков для беглых интерфейсов. Как часто вы хотите GetHashCode () или Equals ()?Для MVC
[ActionName("Name")]
позволяет использовать действие Get и Post с одной и той же сигнатурой метода или использовать тире в имени действия, что в противном случае было бы невозможно без создания для него маршрута.источник
Я считаю важным упомянуть здесь, что следующие атрибуты также очень важны:
Указывает, что модель потоков COM для приложения является однопоточным (STA).
Например, этот атрибут используется в приложениях Windows Forms:
А также ...
Подавляет создание отчетов о конкретном нарушении правил инструмента статического анализа, что позволяет использовать несколько подавлений для одного артефакта кода.
Например:
источник
Вдобавок ко всему, вот быстрый список, примерно отсортированный по частоте использования, предопределенных атрибутов, которые я фактически использую в большом проекте (~ 500 тыс. LoC):
Флаги, Сериализуемый, WebMethod, COMVisible, TypeConverter, Условный, ThreadStatic, Устаревший, InternalsVisibleTo, DebuggerStepThrough.
источник
Я генерирую класс сущности данных через CodeSmith и использую атрибуты для некоторой процедуры проверки. Вот пример:
И я получил служебный класс для проверки на основе атрибутов, прикрепленных к классу сущностей данных. Вот код:
источник
[DeploymentItem("myFile1.txt")]
Документ MSDN по DeploymentItemЭто действительно полезно, если вы тестируете файл или используете файл в качестве входных данных для вашего теста.
источник
[System.Security.Permissions.PermissionSetAttribute]
позволяет применять меры безопасности для PermissionSet к коду с использованием декларативной безопасности.источник