В чем разница между атрибутом С# и статическим полем С#?

Согласно документам Microsoft,

Атрибуты предоставляют мощный метод связывания метаданных или декларативной информации с кодом.

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

Но, насколько я понимаю, и атрибут, и статическое поле

  1. Можно получить доступ во время выполнения
  2. Связать с классом, а не с объектом.

Так в чем же между ними разница?


person Yongda Fan    schedule 04.07.2020    source источник
comment
Вы правы, у них есть некоторые сходства. Но это не делает их одинаковыми, они далеки друг от друга. Это как сравнивать стекло и ноутбук, потому что оба твердые и могут быть повреждены. Может быть, просто напишите, каков ваш вариант использования, и тогда мы сможем дать вам некоторые плюсы и минусы обоих   -  person sTrenat    schedule 04.07.2020
comment
Я изучаю С#, и я с С++. Поэтому я смущен тем, что атрибут может сделать, а статический файл не может.   -  person Yongda Fan    schedule 04.07.2020
comment
Поле (статическое или другое) — это переменная времени выполнения. Атрибут — это класс, экземпляры которого могут быть присоединены к другим классам во время компиляции.   -  person John Wu    schedule 04.07.2020
comment
цель атрибута - украсить класс, метод, свойство или поле, вы можете прикрепить их к любому классу и использовать разными способами, например, чтобы сказать, как проверить свойство, чтобы добавить какое-то удобное для человека описание, которое будет отображаться при вызове .ToString( ), вы можете украсить аргумент метода, чтобы он был CallerMemberName, и он назначит имя вашего вызывающего члена в качестве значения аргумента, вы не можете делать большинство этих вещей со статическими полями. Вы будете использовать статические поля в основном для объявления некоторых констант.   -  person sTrenat    schedule 04.07.2020
comment
@YongdaFan одним из наиболее распространенных вариантов использования атрибутов является сериализация — например, в популярном Newtonsoft Json.NET их можно использовать для описания того, как следует сериализовать/десериализовать класс. Такой же подход можно увидеть и во многих других библиотеках, в том числе встроенных.   -  person Guru Stron    schedule 04.07.2020
comment
Атрибуты не предназначены для изменения во время выполнения; они в первую очередь предназначены для того, чтобы рассказать компилятору о вашем классе. Статические поля — это просто переменные, уникальные в классе и содержащие данные, общие для всех экземпляров или даже для другого кода вне класса. - Вы действительно должны подойти к вопросу с парой вариантов использования!!   -  person TaW    schedule 04.07.2020


Ответы (1)


ОПРЕДЕЛЕНИЕ

Статическое поле данных или свойство – это переменная, инкапсулированная в абстракции определения класса.

Атрибут — это украшение, параметр, а не сами данные, добавляемые к типу класса или к полю-члену, свойству или методу.

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

Атрибут — это класс, который может содержать данные и методы для управления некоторыми видами поведения класса.

Атрибуты позволяют лучше разделить абстракцию и инкапсуляцию.

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

ПРИМЕР

Рассмотрим этот класс:

public class LogFile
{
  static public List<LogFile> LogFiles { get; private set; }
}

Здесь это статический список, содержащий все созданные файлы журналов.

Это данные, переменная, нечто конкретное и осязаемое, непосредственно используемое внутренним и внешним кодом.

Вот пример использования атрибута:

[LogFileStorage(LogFilePath.User)]
public class LogFile
{
}

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

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

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

Классический пример — атрибут Serializable:

https://docs.microsoft.com/dotnet/api/system.serializableattribute

РУКОВОДСТВА

https://www.tutorialspoint.com/csharp/csharp_attributes.htm

https://docs.microsoft.com/dotnet/csharp/programming-guide/concepts/attributes/

https://docs.microsoft.com/dotnet/csharp/tutorials/attributes

https://www.tutorialspoint.com/csharp/csharp_encapsulation.htm

https://www.c-sharpcorner.com/UploadFile/mkagrahari/introduction-to-object-Oriented-programming-concepts-in-C-Sharp/

person Olivier Rogier    schedule 04.07.2020
comment
Я думаю, что понимаю различия. Спасибо за отличное объяснение. - person Yongda Fan; 04.07.2020