C# - Delegates: A Friendly Guide for Beginners
Привет, будущая звезда кодирования! Сегодня мы погрузимся в fascинирующий мир делегатов в C#. Не волнуйтесь, если вы никогда о них не слышали раньше - к концу этого руководства вы станете профи в делегатах! Давайте отправимся в это увлекательное путешествие вместе.
Что такое делегаты?
Представьте, что вы организовываете вечеринку и вам нужно, чтобы кто-то занимался музыкой. Вместо того чтобы делать это самостоятельно, вы делегируете эту задачу своему другу, который является диджеем. В C# делегаты работают аналогичным образом - они как маленькие messengers, которые могут хранить и вызывать методы для нас.
На более простом языке, делегат - это тип, который представляет ссылки на методы с определенным списком параметров и типом返回аемого значения. Представьте его как чертеж для метода.
Объявление делегатов
Давайте начнем с того, чтобы узнать, как объявлять делегаты. Синтаксис довольно прост:
public delegate void SimpleDelegate();
Это объявляет делегат с именем SimpleDelegate
, который может ссылаться на методы, не принимающие параметры и не возвращающие ничего (void).
Вот еще один пример:
public delegate int MathDelegate(int x, int y);
Этот MathDelegate
может ссылаться на любой метод, который принимает два целых числа и возвращает целое число.
Инициализация делегатов
Теперь, когда мы объявили наши делегаты, давайте посмотрим, как их использовать. Мы начнем с создания метода, который соответствует сигнатуре нашего делегата:
public static void SayHello()
{
Console.WriteLine("Hello, Delegates!");
}
// Инициализация делегата
SimpleDelegate greet = new SimpleDelegate(SayHello);
// Вызов делегата
greet();
Когда мы запустим этот код, он выведет: "Hello, Delegates!"
Давайте разберем это:
- Мы определили метод
SayHello
, который соответствует сигнатуре нашегоSimpleDelegate
. - Мы создали экземпляр
SimpleDelegate
и присвоили ему методSayHello
. - Мы вызвали делегат, используя
greet()
, что в свою очередь вызвалоSayHello
.
Многократное использование делегата
Теперь, где делегаты становятся真的很 классными. Они могут хранить ссылки на несколько методов! Это называется многократным использованием. Давайте посмотрим это в действии:
public static void SayHello() { Console.WriteLine("Hello"); }
public static void SayGoodbye() { Console.WriteLine("Goodbye"); }
SimpleDelegate greetings = SayHello;
greetings += SayGoodbye;
greetings(); // Это вызовет и SayHello, и SayGoodbye
Результат:
Hello
Goodbye
Не правда ли это здорово? Мы добавили два метода к нашему делегату, и когда мы вызываем его, оба метода вызываются в порядке, в котором они были добавлены.
Использование делегатов
Делегаты невероятно полезны во многих сценариях. Один из.commonных примеров - обработка событий. Давайте посмотрим на простой пример:
public delegate void TemperatureChangedHandler(float newTemperature);
class Thermostat
{
private float _temperature;
public event TemperatureChangedHandler TemperatureChanged;
public float Temperature
{
get { return _temperature; }
set
{
if (_temperature != value)
{
_temperature = value;
OnTemperatureChanged();
}
}
}
protected virtual void OnTemperatureChanged()
{
if (TemperatureChanged != null)
{
TemperatureChanged(_temperature);
}
}
}
class Program
{
static void Main()
{
Thermostat thermostat = new Thermostat();
thermostat.TemperatureChanged += HandleTemperatureChange;
thermostat.Temperature = 25.5f;
}
static void HandleTemperatureChange(float newTemperature)
{
Console.WriteLine($"Temperature changed to {newTemperature}°C");
}
}
В этом примере мы создали класс Thermostat
, который использует делегат для уведомления о изменении температуры. Метод Main
подписывается на это событие, и когда температура устанавливается, вызывается метод HandleTemperatureChange
.
Методы делегата
Вот таблица некоторых commonных методов, связанных с делегатами:
Метод | Описание |
---|---|
Invoke | Вызывает методы, которые хранятся в делегате |
BeginInvoke | Начинает асинхронный вызов делегата |
EndInvoke | Окончание асинхронного вызова делегата |
GetInvocationList | Возвращает массив делегатов, представляющих список вызовов |
Заключение
Поздравления! Вы только что сделали свои первые шаги в мир делегатов в C#. Мы рассмотрели объявление делегатов, их инициализацию, многократное использование и даже пример prakticheskogo использования с обработкой событий.
помните, что делегаты могут показаться немного абстрактными сначала, но они являются incredibly мощными инструментами в C#. Они позволяют гибкую и loosely-coupled архитектуру, особенно в event-driven программировании.
По мере того, как вы продолжаете свое путешествие в C#, вы найдете все больше и больше uses для делегатов. Они как швейцарский армейский нож в вашем наборе инструментов для кодирования - многофункциональны и всегда под рукой, когда они вам нужны.
Продолжайте практиковаться, оставайтесь любопытными, и.before you know it, вы будете делегировать задачи вашему коду как профи! Счастливого кодирования!
Credits: Image by storyset