Я думаю, что текущие ответы пренебрегают, чтобы подчеркнуть фактические важные и существенные различия и что это означает для предполагаемого использования. Хотя они оба могут работать в определенных ситуациях, потому что разработчик встроил поддержку обоих, у них разные сценарии использования. Оба могут комментировать свойства и методы, но вот некоторые важные различия:
DisplayAttribute
- определено в
System.ComponentModel.DataAnnotations
пространстве имен в System.ComponentModel.DataAnnotations.dll
сборке
- может использоваться для параметров и полей
- позволяет вам установить дополнительные свойства, такие как
Description
или ShortName
- можно локализовать с помощью ресурсов
DisplayNameAttribute
- DisplayName находится в
System.ComponentModel
пространстве имен в System.dll
- может использоваться на классах и событиях
- невозможно локализовать с помощью ресурсов
Сборка и пространство имен говорят о предполагаемом использовании, а поддержка локализации - самый важный момент. DisplayNameAttribute
существует с .NET 2 и, похоже, больше предназначался для именования компонентов и свойств разработчика в устаревшей сетке свойств, не столько для вещей, которые видны конечным пользователям, которым может потребоваться локализация и тому подобное.
DisplayAttribute
был введен позже в .NET 4 и, похоже, предназначен специально для маркировки членов классов данных, которые будут видны конечному пользователю, поэтому он больше подходит для DTO, объектов и других подобных вещей. Я нахожу весьма прискорбным, что они ограничили это, так что это не может быть использовано на классах.
РЕДАКТИРОВАТЬ: Похоже, что последний источник .NET Core позволяет использовать DisplayAttribute
также и на классах.