SellerNumbOne, код, нуждающийся в выполнении действия, не знает метода вызова, когда он написан. Можно вызвать метод напрямую только в том случае, если знаете во время компиляции, какой метод вызывать, не так ли? Поэтому, если вы хотите абстрагировать идею "perform action X at the appropriate time", вам нужно некоторое представление действия, чтобы метод, вызывающий действие, не знал точную реализацию заранее.
Лично я использую их так: Иногда тебе в метод нужно добавить исполняемый код, которого там нет, для этого делегаты прекрасно подойдут
Смотри, постараюсь объяснить на доступном примере(весь код в конце) Допустим у нас класс Person, у которого есть свойства Name и LastName. Есть метод, возвращающий эти значения. И нам нужно реализовать вывод, но неизвестно выводить будем в консоль или на тот же WinForms. Тут на помощь приходят делегаты, которые хранят в себе ссылку на метод. В данном случае в делегат мы засовываем ссылку на метод с такой же сигнатурой и выводим нужное нам сообщение в консоль. Class Person namespace TestConsole { public delegate void ShowInfo(string message); class Person { public string Name { get; set; } public string LastName { get; set; } public Person(string name, string lastName) { Name = name; LastName = lastName; } public string GetInfo() { return $"Меня зовут {Name}, а фамилия {LastName}"; } } } Код namespace TestConsole { public delegate void ShowInfo(string message); class Person { public string Name { get; set; } public string LastName { get; set; } public Person(string name, string lastName) { Name = name; LastName = lastName; } public string GetInfo() { return $"Меня зовут {Name}, а фамилия {LastName}"; } } } Main class Program { static void Main(string[] args) { Person johnSmith = new Person("John", "Smith"); ShowInfo showInfo = WriteInConsole; showInfo.Invoke(johnSmith.GetInfo()); } private static void WriteInConsole(string message) { Console.WriteLine(message); } } Код class Program { static void Main(string[] args) { Person johnSmith = new Person("John", "Smith"); ShowInfo showInfo = WriteInConsole; showInfo.Invoke(johnSmith.GetInfo()); } private static void WriteInConsole(string message) { Console.WriteLine(message); } }
Банальный пример Делегат на уведомление пользователя однако пользователь может выбрать разные способы уведомления(смс, почта, очное уведомление) При этом тебе нужно как-то описать уведомление в своей программе - делегаты отлично подойдут