Преимущества использования делегатов? - PullRequest
7 голосов
/ 19 ноября 2008

Я хочу реализовать шаблон Observer в VB.NET или C # или каком-либо другом первоклассном языке .NET. Я слышал, что для этого могут использоваться делегаты, но я не могу понять, почему они предпочтительнее, чем простые старые интерфейсы, реализованные на наблюдателях. Таким образом,

  • Почему я должен использовать делегаты вместо определения собственных интерфейсов и передачи ссылок на объекты, реализующие их?
  • Почему я могу хотеть избегать использования делегатов и использовать хорошие устаревшие интерфейсы?

Ответы [ 14 ]

1 голос
/ 19 ноября 2008

Я слышал, как некоторые "евангелисты событий" говорили об этом, и они говорили, что чем больше разобщенных событий, тем лучше.

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

С учетом сказанного, делегаты являются идеальным инструментом для этой работы. Они позволяют разделить источник события и наблюдателя события, потому что источник события не должен хранить список всех объектов-наблюдателей. Он содержит только список «указателей функций» (делегатов) наблюдателей. Поэтому я думаю, что это большое преимущество перед интерфейсами.

0 голосов
/ 03 октября 2011

Вот пример, который может помочь.

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

Непосредственной задачей является создание 6 различных методов, каждый из которых возвращает отфильтрованные данные. Например

public Data FilterByAge (int age)

public Data FilterBySize (int size)

.... и т. Д.

Это нормально, но очень ограниченно и создает мусорный код, потому что он закрыт для расширения.

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

общедоступный фильтр данных (фильтр действий)

тогда код для использования становится

Фильтр (data => data.age> 30);

Фильтр (data => data.size = 19);

Код данных => бла-бла становится делегатом. Код становится намного более гибким и остается открытым.

0 голосов
/ 20 декабря 2010

Вот кое-что, что я могу записать в качестве причины использования делегата. Следующий код написан на C # И, пожалуйста, следуйте комментариям.

public delegate string TestDelegate();
protected void Page_Load(object sender, EventArgs e)
{
    TestDelegate TD1 = new TestDelegate(DiaplayMethodD1);
    TestDelegate TD2 = new TestDelegate(DiaplayMethodD2);
    TD2 = TD1 + TD2; // Make TD2 as multi-cast delegate
    lblDisplay.Text =  TD1(); // invoke delegate
    lblAnotherDisplay.Text = TD2();


    // Note: Using a delegate allows the programmer to encapsulate a reference 
    //       to a method inside a delegate object. Its like the function pointer
    //       in C or C++.    
}
//the Signature has to be same.
public string DiaplayMethodD1()
{
    //lblDisplay.Text = "Multi-Cast Delegate on EXECUTION"; // Enable on multi-cast 
    return "This is returned from the first method of delegate explanation";
}
// The Method can be static also
public static string DiaplayMethodD2()
{
    return " Extra words from second method";
}

С наилучшими пожеланиями, Притом Нэнди, Бангладеш

0 голосов
/ 28 июня 2010

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

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

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

привет

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