Din7
@Din7
Пытаюсь программировать, CGmaster - ломастер

Что делают делегаты в C#?

Почитала я про делегаты, поняла, что это тип объектов, типо й ссылок на методы. Но все равно не понимаю, вот например:
long Sum(List<int> intList)
{
  long result = 0;
  intList.ForEach(delegate(int i) { result += i; });
  result result;
}

что здесь делает делегат?
  • Вопрос задан
  • 1022 просмотра
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Вашу задачу можно сделать тремя способами:
1) создать метод, который будет суммировать каждый элемент списка в переменную, точнее, в поле класса.
long Result;
long Sum(List<int> intList)
{
    Result = 0;
    intList.ForEach(AddElement);
    return Result;
}

void AddElement(int i)
{
    Result += i;
}

2) Чтобы не создавать "лишнюю" функцию, необходимую только для конкретной задачи, то можно взять анонимную функцию. Анонимные функции в C# используются с помощью делегатов. Дополнительно, анонимные функции могут использовать замыкания, и нет необходимости создавать внешнее поле.
long Sum(List<int> intList)
{
    long result = 0;
    intList.ForEach(delegate(int i) { result += i; });
    return result;
}

3) Можно взять лямбду - в данном случае, это "синтаксический сахар" - упрощение создания делегата.
long Sum(List<int> intList)
{
    long result = 0;
    intList.ForEach(i => result += i);
    return result;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@dmitryKovalskiy
программист средней руки
В данном коде внутрь метода ForEach передается делегат, который вызывается для каждого элемента списка intList. По коду он прибавляет к переменной result все элементы списка. Для конкретной задачи есть десяток решений проще и надежнее, а данный выглядит как говно. Да, делегаты используют для передачи в качестве параметра метода - ссылки на метод, удовлетворяющей сигнатуре делегата.
Ответ написан
Комментировать
В данном случае суммирует элементы. Увеличивает значение result на текущий элемент из intList
UPD: в данном случае это ссылка на анонимный метод
Ответ написан
Комментировать
EreminD
@EreminD
Кое-что умею
Вот здесь хорошо рассказывается на эту тему.
Скачайте учебник Троелсена - он вполне себе понятно объясняет вообще все)
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C#
Функциональный объект.
Как разберетесь, что это, так и поймете, что такое делегат.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы