2012-06-27 2 views
4

рассмотреть следующее:В чем разница между вложенным вызовом метода и делегатами?

1-й подход:

public void f3() 
{ 
f2(); 
f1(); 
} 

и это ...

второй подход:

class Sample 
{ 
    public delegate void MyDelegate(string s); 
    MyDelegate obj; 

    public Sample() 
    { 
     obj += new MyDelegate(input); 
     obj+=new MyDelegate(something); 
     obj += new MyDelegate(someStaticMethod); 
    } 
} 

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

+4

Если вы используете делегат, вы можете * делегировать работу * кому-то другому. Теперь ваши пользователи могут предоставлять настраиваемую реализацию вместо жесткого кодирования любой функции. –

+0

за исключением использования ... оба пути похожи? я имею в виду способ, которым будут ссылаться методы, такие же .. ryt? –

ответ

6

В случае делегирования вызов порядок присоединенных функций не указан.

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

+1

Кроме того, трассировка стека должна быть легче читать при отладке. –

+0

+1 Это довольно хороший ответ. Я также хотел бы упомянуть, что делегат является ссылкой на метод. Вам нужно только знать подпись во время компиляции, тогда как в первом подходе OP вам нужно будет точно знать, какие методы вызывать. –

+1

Если у вас есть функции, которые * должны * запускаться в указанном порядке, то первый подход является правильным. В противном случае они концептуально одинаковы, но второй более гибкий в том, что он может сделать. –

1

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

+0

Я был бы осторожен со словом * static *, чтобы не путать его с ключевым словом 'static'. : p –

+0

да да .. я получил то, что и имел в виду ... :)) –

Смежные вопросы