@kowr3

Делегаты, зачем?

Знаю что много было задано вопросов по этим делегатам на просторе инета, и на хабре в том числе. Но я все таки и не уловил суть этих демонов "делегатов". Я понял, что делегаты хранят ссылки на методы. Но зачем делегату хранить ссылку на метод, если можно вызвать этот метод, и без помощи делегата ? Вот даже пример из метанита, чем это:
Account ac = new Account();
ac.RegisterHandler(PrintMessage);
ac.Put(100);

void PrintMessage(string message)
{
    Console.WriteLine(message);
}
class Account
{
    int Sum;
    public delegate void MessageHandler(string message);
    public MessageHandler? mes;
    public void RegisterHandler(MessageHandler reg)
    {
        mes = reg;
    }

    public void Put(int sum)
    {
        Sum += sum;
        mes?.Invoke($"На счет было положено: {Sum}");
    }
}

Лучше чем вот это:
Account ac = new Account();
ac.Put(100);

class Account
{
    int Sum;
    public void Put(int sum)
    {
        Sum += sum;
        Console.WriteLine($"На счет было положено: {Sum}");
    }
}

Ведь и код короче, и более читабельней вроде выглядит..

P.S - прежде чем некоторые надумают написать: "очередной гений задал вопрос, на который уже дан ответ", лучше не пишите ничего пжпжп)) Знаю что дан, но для некоторых (в том числе и для меня) доходит долго. Спасибо :)
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
MSerhio
@MSerhio
Вхожу в IT
Делегат позволяет ослабить связность кода, а рассматривать их стоит вместе с событиями.
Я объясню на примере игростроя.
Популярный в сети пример: во врага попала пуля. Должно случиться сразу много вещей - нужно снять здоровье врага, выяснить, не погиб ли он, проиграть анимацию, уничтожить пулю, начислить очки игроку и еще что-то.
Если мы будем всё это вызывать напрямую, то быстро запутаемся и ошибемся. А когда будем переделывать, сломаем всё окончательно.
Вот тут нас выручат делегаты и события. Мы определим событие, которое срабатывает (вызывает свой делегат) в момент попадания пули. И соответственно, определим делегат для этого события.
Теперь каждый метод, которому это событие интересно, может подписаться на его делегат (внести себя в список вызываемых делегатом методов - их может быть больше одного).
И теперь мы можем переделывать что угодно. Главное, не забывать подписываться и отписываться.
Делегат, это как автолавка в деревне: приезжает и сигналит. Кому надо - выходит. При этом ни автолавке ни покупателям не интересно, что происходит у каждой из сторон в отдельности.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Лучше чем вот это:

Тем что класс Account ты теперь менять не можешь, это не твой код, и впиндюрить туда WriteLine соответственно тоже, но очень хочется.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы