получаю голову вокруг делегатов C # - PullRequest
2 голосов
/ 28 июля 2011

Я хорошо разбираюсь в C #, но просто не могу разобраться с делегатами.

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

Имеет смысл для таких событий, как MouseClick, подождите, пока MouseClick не будет запущен, а затем перейдите к MouseClick (), но я не понимаю этого в коде.Я понимаю функцию внутри функции для javascript, и я не нахожу никаких программных способов сделать это на C #, поэтому делегировать путь?

Сегодня я прочитал об этом около 3 блогов и надеюсь, что кто-нибудьСлушание дало бы мне знать, когда делегат необходим на 100%, и больше ничего не будет делать.

Ответы [ 5 ]

4 голосов
/ 28 июля 2011

Почему бы просто не использовать функцию?

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

У меня есть пара статей о делегатах:

Надеюсь, по крайней мере, один из них поможет вам ... (Я подозреваю, что ближайший эквивалент "функция в функции", кстати, является лямбда-выражением.)

1 голос
/ 28 июля 2011

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

0 голосов
/ 28 мая 2015

Иногда это помогает мне упростить концепции, ссылаясь на знакомые концепции.

Представьте себе делегата как контейнер (см. Изображение ниже):

enter image description here

A функция = деревянный блок, который помещается внутри этого контейнера.

Мы не можем передавать функции напрямую, например, в качестве параметров, но мы можем передавать делегатов! Таким образом, в основном мы помещаем деревянный блок (функцию) в контейнер (делегат) и можем теперь передать его в качестве параметра и использовать его, когда нам нужно.

Подпись = крышка. Это гарантирует, что мы можем поместить в контейнер только блок правильной формы.

Вызов делегата = взятие всех блоков (функций) в контейнере и «вызов» или «вызов» этих функций.

многоадресный делегат - это когда мы помещаем более 1 блока в контейнер (поэтому, когда мы вызываем многоадресный делегат, все функции внутри будут вызываться).

Событие будет просто контейнером (делегатом) с блокировкой. Это препятствует тому, чтобы кто-то открыл крышку, выливая все блоки внутри.

Эти абстракции взяты из моего блога, если вы хотите прочитать более подробно

Простое объяснение делегатам и мероприятиям

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

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

0 голосов
/ 28 июля 2011

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

0 голосов
/ 28 июля 2011

Вы можете использовать функции вместо делегатов, но делегаты делают ваш код чище и читабельнее (например, меньше строк).

[] s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...