Каква е разликата между C# Attribute и C# Static Field?

Според документи на Microsoft,

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

Статичният член може да бъде извикан в клас, дори когато не е създаден екземпляр на класа. Статичният член винаги е достъпен от името на класа, а не от името на екземпляра.

Но според моето разбиране и атрибутът, и статичното поле са

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

И така, каква е разликата между тях?


person Yongda Fan    schedule 04.07.2020    source източник
comment
Прав си, те имат няколко прилики. Но това не ги прави еднакви, те са далеч един от друг. Това е като да сравнявате стъкло и лаптоп, защото и двете са твърди и могат да се повредят. Може би просто кажете какъв е вашият случай на употреба и тогава можем да ви дадем някои предимства и недостатъци и на двете   -  person sTrenat    schedule 04.07.2020
comment
Уча C# и съм от C++. Така че се чувствам объркан какво може да направи Attribute, което статичното поле не може.   -  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