Что значит украшать класс или параметр?

Что значит украшать или добавлять атрибут к классу или параметру?
Какова цель и когда я это сделаю?

Ссылки на ресурсы и прямые ответы приветствуются.

Благодарю.

Ответ 1

Когда вы добавляете декоратор в С#, это похоже на добавление свойства к классу/методу. К нему будет прикреплен атрибут.

Если вы напишите unit тест, вы встретите простой декоратор TestMethod, например:

[TestMethod]
public void TestMethod1()
{
}

Фреймворк будет использовать декораторы для проверки методов тестирования в наборе тестов.

Вы можете проверить атрибут здесь

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

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

Ответ 2

Декоратор был одним из первых 26 шаблонов, описанных в книге "Банды четырех" "Шаблоны дизайна". Они хорошо это описывают здесь.

Резюме:

Декоратор: добавьте дополнительную функциональность классу во время выполнения, где создание подклассов приведет к экспоненциальному росту новых классов

Шаблоны не зависят от языка. Это описания решений общих проблем в объектно-ориентированном программировании. Возможно, даже предпочтительнее, обсуждать их без привязки к конкретному языку. Примеры в оригинальной книге были написаны в C++ и Smalltalk. Ни Java, ни С# не существовали, когда книга была впервые опубликована в 1995 году.

Ответ 3

Украшение класса означает добавление функциональности в существующий класс. Например, у вас есть класс SingingPerson, у которого есть талант пения.

public class SingingPerson
{
    public string Talent = "I can sing";
    public string DoTalent()
    {
        return Talent;
    }
}

Позже вы решили, что класс SingingPerson должен также танцевать, но не хочет изменять существующую структуру класса. То, что вы делаете, - это украсить класс SingingPerson, создав еще один класс, который содержит добавленную функциональность. Этот новый класс, который вы создадите, принимает объект SinginPerson.

public class SingingAndDancingPerson {
    SingingPerson person;
    public string Talent { get; set; }
    public SingingAndDancingPerson(SingingPerson person)
    {
        this.person = person;
    }

    public string DoTalent()
    {
        this.Talent = person.Talent;
        this.Talent += " and dance";
        return this.Talent;
    }
}

При попытке создать экземпляры этих классов вывод будет следующим:

 SingingPerson person1 = new SingingPerson();
        Console.WriteLine("Person 1: " + person1.DoTalent());
        SingingAndDancingPerson person2 = new SingingAndDancingPerson(person1);
        Console.WriteLine("Person 2: " + person2.DoTalent());
        Console.ReadLine();