2016-02-26 3 views
0

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

public delegate void HelloFunctionDelegate(string message); 

    public class Delegate 
    { 
     static void Main() 
     { 
      HelloFunctionDelegate del = new HelloFunctionDelegate(GoodNight); // delegate will point to the GoodNight method 

      del("Hello"); // invoke the delegate 
     } 

     public static void GoodMorning(string strMessage) 
     { 
      Console.WriteLine(strMessage + " and good morning!"); 
      Console.ReadKey(); 
     } 

     public static void GoodNight(string strMessage) 
     { 
      Console.WriteLine(strMessage + " and good night!"); 
      Console.ReadKey(); 
     } 
    } 

Так в моем примере я понимаю, что мой делегат является ссылкой на какую-либо функцию, которая соответствует его подписи и, если я прохожу в Goodmorning я увидеть: Hello and good morning!

и если я прохожу в GoodNight я буду см: Hello and good night!

Так его вроде как проходит через средний человек ...

Я не понимаю, в чем дело, почему бы мне просто не напрямую позвонить мой GoodMorning/Методы GoodNight, когда и когда мне нужно их использовать?

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

+0

Возможно выполнение задержки. Например, используйте метод расширения .ForEach() ', он принимает делегат, который будет выполнен для элемента в списке. Поэтому эти делегаты задерживаются в их исполнении. –

+0

Попробуйте выполнить поиск, существует много дубликатов. – CodeCaster

+0

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

ответ

2

Поскольку вы конкретно спрашиваете об этом примере, а не вообще: в этом конкретном фрагменте кода нет смысла делать это. Он учит вас механикам делегатов, но он не учит вас использовать их.

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

0

Рассмотрим у вас есть следующий делегат:

public delegate void CarEvent(Car car); 

И тогда у вас есть реализация вроде следующего:

public class Car : DataRecord 
{ 
    // An event to execute when the record is deleted 
    public CarEvent OnDelete { get; set; } 

    public void Delete() 
    { 
     this.DeleteRecord(); // Deletes this record from ex. the database 

     if (OnDelete) 
     { 
      OnDelete(this); // Executes the event 
     } 
    } 
} 

С помощью делегата вы можете подписаться на различные методы к OnDelete позволяя вам делать разные вещи, когда запись удаляется.

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

public class CarList : ListView 
{ 
    public CarList() 
     : base() 
    { 
     foreach (var car in CarRecords.LoadCars()) 
     { 
      var listViewItem = new ListViewItem(car); 
      car.OnDelete = this.DeleteCarFromList; 

      this.Items.Add(listViewItem); 
     } 
    } 

    private void DeleteCarFromList(Car deletedCar) 
    { 
     this.Items.Remove(deletedCar); 
    } 
} 

Конечно вышеизложенное грубый пример, и есть много вещей, и различного рода ситуациях, где вы можете использовать делегатов и, прежде всего, если вы хотите использовать их для событий, которые вы должны рассмотреть их реализации с использованием event ключевое слово. - https://msdn.microsoft.com/en-us/library/awbftdfh.aspx

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

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

Надеюсь, это объяснило это хорошо.

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