Лучшие практики: Когда я должен использовать делегата в.NET? [дубликат]

Можно зафиксировать это первым вызовом конструктора по умолчанию:

struct MyStruct 
{
    public MyStruct(int size) : this() 
    {
        this.Size = size; // <-- now works
    }

     public int Size { get; set; }
}
11
задан Community 23 May 2017 в 12:19
поделиться

7 ответов

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

List<Foo> foos = new List<Foo>();
foos.Find(delegate(Foo foo)
    {
        if(foo.CustomProperty.Contains("special value"))
        {
            return false;
        }
        return true;
    });

Приведенный выше пример является совершенно произвольным, но подчеркивает, что вы можете отделить что (итерация и выполнение критериев «найти») от как (как определить, что что-то найдено).

4
ответ дан 3 December 2019 в 05:13
поделиться

Кроме того, я бы рекомендовал использовать общие типы делегатов вместо создания собственных. Примеры ниже:

EventHandler
Func
Func
Func и т. Д.
Action
Action
Действие и т.д ...

3
ответ дан 3 December 2019 в 05:13
поделиться

Делегаты позволяют вам передавать поведение в качестве параметра.

Распространенными примерами являются события и асинхронное программирование, когда что-то другое, кроме вашего объекта, отвечает за вызов ваш объект. Вы предоставляете это событие с помощью делегата, и теперь он может выполнять поведение, связанное с этим делегатом.

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

В ответ на комментарий:

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

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

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

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

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

8
ответ дан 3 December 2019 в 05:13
поделиться

События используют делегатов за кулисами.

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

В основном они используются для обратных вызовов или программирования на основе событий.

2
ответ дан 3 December 2019 в 05:13
поделиться

Делегаты используются для программирования, управляемого событиями. Лучшие практики часто касаются разделения кода (или «слабой» связи). Используя делегаты, вы можете подписывать методы на события, вместо того, чтобы X вызывать Y, если что-то происходит, а затем Y вызывает Z при определенных условиях и так далее.

2
ответ дан 3 December 2019 в 05:13
поделиться

События и обратные вызовы в руководящих принципах .NET это хорошо объясняют.

Таким образом, вам следует предпочесть события в простых API, потому что существует сильная поддержка IDE и большинство разработчиков привыкли к событиям. Однако, если вам нужно, чтобы пользователь предоставил код, который будет выполняться, вам следует рассмотреть возможность использования делегатов или виртуальных членов. Обратные вызовы менее производительны, но если вы используете делегаты, такие как Action и Func , вы разрешаете лямбда-выражения.

2
ответ дан 3 December 2019 в 05:13
поделиться

Пример случая: один ресурс используется несколькими объектами. Ресурсу требуется асинхронный обратный вызов для этих объектов, но природа ресурса требует, чтобы в определенный момент времени был активен только один запрос, и этот запрос был привязан к определенному объекту. Из-за архитектуры я не хочу передавать объекты в ресурс, поэтому вместо этого я отправляю ресурсу делегат от каждого объекта и сохраняю эти делегаты вместе с идентификаторами объектов. Когда делается запрос, я могу найти соответствующий идентификатор объекта и вызвать его конкретный делегат.

Изначально я реализовал это с помощью события, но поскольку событие не могло быть «нацелено» на конкретный объект, у меня было вопросы. Я не уверен, что это лучший способ, но, похоже, мне он подходит.

1
ответ дан 3 December 2019 в 05:13
поделиться
Другие вопросы по тегам:

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