Вы можете думать о нем как о типе, в котором вы можете хранить ссылки на функции.Таким образом, вы можете сохранить функцию в переменной, чтобы потом вызывать ее, как и любую другую функцию.
Например,
public delegate void AnEmptyVoidFunction();
Это создает тип делегата с именем AnEmptyVoidFunction
и его можно использовать для хранения ссылок на функции, которые возвращают void и не имеют аргументов.
Затем можно сохранить ссылку на функцию с этой подписью.
public static void SomeMethod() { }
public static int ADifferentMethod(int someArg) { return someArg; }
AnEmptyVoidFunction func1 = new AnEmptyVoidFunction(SomeMethod);
// or leave out the constructor call to let the compiler figure it out
AnEmptyVoidFunction func2 = SomeMethod;
// note that the above only works if it is a function defined
// within a class, it doesn't work with other delegates
//AnEmptyVoidFunction func3 = new AnEmptyVoidFunction(ADifferentMethod);
// error wrong function type
Мало того, что она можетхранить объявленные функции, но также и анонимные функции (т. е. лямбды или анонимные делегаты)
// storing a lambda function (C#3 and up)
AnEmptyVoidFunction func4 = () => { };
// storing an anonymous delegate (C#2)
AnEmptyVoidFunction func5 = delegate() { };
Для вызова этих делегатов вы можете просто вызывать их, как и любой другой вызов функции.Хотя, поскольку это переменная, вы можете заранее проверить, является ли она null
.
AnEmptyVoidFunction func1 = () =>
{
Console.WriteLine("Hello World");
};
func1(); // "Hello World"
AnEmptyVoidFunction func2 = null;
func2(); // NullReferenceException
public static void CallIt(AnEmptyDelegate func)
{
// check first if it is not null
if (func != null)
{
func();
}
}
Вы можете использовать их в любое время, когда вам потребуется передать метод, который вы хотите вызвать.Почти так же, как вы можете передавать экземпляры объектов, чтобы вы могли делать с ними то, что вы хотите.Типичный вариант использования делегатов - при объявлении событий.Я написал другой ответ , описывающий шаблон, чтобы вы могли посмотреть на него для получения дополнительной информации о том, как их написать.