Короче говоря , делегат — это указатель на функцию.
То есть представьте, что вы можете создать функцию и присвоить ее переменной, чтобы передать ее в качестве параметра там, где она вам нужна. Разумеется, наследуя все характеристики CLR, включая безопасность и строгую типизацию.
Делегат — это ссылочный тип, который можно использовать для инкапсуляции именованного или анонимного метода.Делегаты аналогичны указателям функций в C++, но более безопасны и обеспечивают лучшую безопасность типов.
Делегат — это тип, представляющий ссылки на методы с заданным списком параметров и типом возвращаемого значения. При создании экземпляра делегата вы можете присоединить его экземпляр к любому методу, используя совместимую сигнатуру и тип возвращаемого значения. Вы можете вызывать (или вызывать) метод через экземпляр делегата.
Пример (msdn)
using System;
public class SamplesDelegate {
public delegate String myMethodDelegate( int myInt );
public class mySampleClass {
public String myStringMethod ( int myInt ) {
if ( myInt > 0 )
return( "positive" );
if ( myInt < 0 )
return( "negative" );
return ( "zero" );
}
public static String mySignMethod ( int myInt ) {
if ( myInt > 0 )
return( "+" );
if ( myInt < 0 )
return( "-" );
return ( "" );
}
}
public static void Main() {
mySampleClass mySC = new mySampleClass();
myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
}
}
/*
This code produces the following output:
5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
Для создания делегата необходимо указать какие параметры и тип возвращаемого значения , например:
delegate double Operacion(double x);
Operacionсовместим с любым методом, который возвращает a doubleи имеет только один параметр типа double, например:
static double Cuadrado(double x) { return x * x; }
Присвоение метода переменной типа Operacionсоздает экземпляр делегата:
Operacion op = Cuadrado;
наконец, мы можем использовать этот экземпляр для вызова метода, на который он ссылается:
double resultado = op(4); // 16
В C# делегаты обычно используются в событиях и в качестве обратных вызовов для динамического взаимодействия между различными частями приложения. Обратные вызовы и делегаты настолько распространены, что в C# 3 был добавлен новый, более компактный синтаксис в виде лямбда-выражений для представления делегата:
// Delegado anterior en forma de expresión lambda
Operacion op = x => x * x;
Хотя поведение делегатов можно эмулировать с помощью интерфейса, у них есть дополнительная функция, называемая многоадресной рассылкой , которая означает, что один экземпляр может ссылаться более чем на один метод, например:
MiDelegado d = Metodo1;
d += Metodo2; // Añade un nuevo método a la lista del delegado
Теперь при вызове dобоих методов они будут вызываться, причем порядок, в котором они вызываются, совпадает с порядком, в котором они добавляются в список делегатов.
Ярким примером использования делегатов и обратных вызовов является LINQ , тип List<T>имеет множество методов, которые принимают делегат (или лямбда-выражение) и выполняют разные действия:
List<int> numeros = Enumerable.Range(1, 200).ToList();
var impares = numeros.Find(n => n % 2 == 1);
В этом случае метод Findпринимает тип делегата с одним аргументом intи типом возвращаемого значения bool, через этот обратный вызов мы находим нечетные числа в списке.
Делегат — это способ C# объявления типов, функция которых является указателем на функцию. Делегат позволяет вам назначать подпись имени, чтобы все переменные, созданные на основе этого имени, могли хранить указатели на функции, совместимые с этой подписью.
Переменная на основе делегата может указывать либо на функцию-член класса, либо на объект lambda.
Какой смысл использовать делегатов? Альтернативой было бы писать подпись при каждом использовании вместо делегата. Посмотрите, например, на языки более низкого уровня, такие как c или c++ . В этих случаях отсутствует понятие делегата как такового. Однако, поскольку запись сигнатуры функции в нескольких местах создает сложный код для управления, мы выбираем псевдоним функции, использующей typedefили самой последней using(в c++11 ). Эти псевдонимы будут эквивалентны делегату C# .
Более чем аналогия, я не знаю, работает ли то, что они для меня простыми словами, для вас: делегат позволяет вам отправить метод в качестве параметра другому методу.
Делегат — это тип, который определяет сигнатуру метода и может быть связан с любым методом с совместимой сигнатурой. Вы можете вызвать (или вызвать) метод через делегат. Делегаты используются для передачи методов в качестве аргументов другим методам. Обработчики событий — это не что иное, как методы, вызываемые через делегаты.
пример:
//Declaramos
public delegate void stackOverFlowEsDelegado(string mensaje, int cantidadVeces);
//Instanciamos
stackOverFlowEsDelegado delegadoDeEjemplo = new stackOverFlowEsDelegado(stackOverFlowEs);
//invocamos
delegadoDeEjemplo("ejemplo de delegado en stackoverflow ES", 5);
В этой статье у вас есть хороший пример делегата- делегата C# .
Функция делегатов состоит в том, чтобы позволить вам манипулировать или работать с объектами в других потоках вашего приложения, иначе при попытке доступа к нему будет возвращена ошибка или, по крайней мере, для этого я обычно использую делегаты.
Делегат в C# подобен типу данных, указывающему на метод, что позволяет нам расширять возможности нашего кода или разрешать это делать другим. Способ объявить делегата следующий: delegate().
Короче говоря , делегат — это указатель на функцию.
То есть представьте, что вы можете создать функцию и присвоить ее переменной, чтобы передать ее в качестве параметра там, где она вам нужна. Разумеется, наследуя все характеристики CLR, включая безопасность и строгую типизацию.
MSDN:
msdn: Делегаты (Руководство по программированию на C#)
Пример (msdn)
Делегат — это объект, содержащий ссылку на метод.
Для создания делегата необходимо указать какие параметры и тип возвращаемого значения , например:
Operacion
совместим с любым методом, который возвращает adouble
и имеет только один параметр типаdouble
, например:Присвоение метода переменной типа
Operacion
создает экземпляр делегата:наконец, мы можем использовать этот экземпляр для вызова метода, на который он ссылается:
В C# делегаты обычно используются в событиях и в качестве обратных вызовов для динамического взаимодействия между различными частями приложения. Обратные вызовы и делегаты настолько распространены, что в C# 3 был добавлен новый, более компактный синтаксис в виде лямбда-выражений для представления делегата:
Хотя поведение делегатов можно эмулировать с помощью интерфейса, у них есть дополнительная функция, называемая многоадресной рассылкой , которая означает, что один экземпляр может ссылаться более чем на один метод, например:
Теперь при вызове
d
обоих методов они будут вызываться, причем порядок, в котором они вызываются, совпадает с порядком, в котором они добавляются в список делегатов.Ярким примером использования делегатов и обратных вызовов является LINQ , тип
List<T>
имеет множество методов, которые принимают делегат (или лямбда-выражение) и выполняют разные действия:В этом случае метод
Find
принимает тип делегата с одним аргументомint
и типом возвращаемого значенияbool
, через этот обратный вызов мы находим нечетные числа в списке.Делегат — это способ C# объявления типов, функция которых является указателем на функцию. Делегат позволяет вам назначать подпись имени, чтобы все переменные, созданные на основе этого имени, могли хранить указатели на функции, совместимые с этой подписью.
Переменная на основе делегата может указывать либо на функцию-член класса, либо на объект
lambda
.Какой смысл использовать делегатов? Альтернативой было бы писать подпись при каждом использовании вместо делегата. Посмотрите, например, на языки более низкого уровня, такие как c или c++ . В этих случаях отсутствует понятие делегата как такового. Однако, поскольку запись сигнатуры функции в нескольких местах создает сложный код для управления, мы выбираем псевдоним функции, использующей
typedef
или самой последнейusing
(в c++11 ). Эти псевдонимы будут эквивалентны делегату C# .Более чем аналогия, я не знаю, работает ли то, что они для меня простыми словами, для вас: делегат позволяет вам отправить метод в качестве параметра другому методу.
согласно мсдн :
пример:
В этой статье у вас есть хороший пример делегата- делегата C# .
Использование делегатов
Функция делегатов состоит в том, чтобы позволить вам манипулировать или работать с объектами в других потоках вашего приложения, иначе при попытке доступа к нему будет возвращена ошибка или, по крайней мере, для этого я обычно использую делегаты.
Надеюсь, я помог вам, с уважением.
Делегат в C# подобен типу данных, указывающему на метод, что позволяет нам расширять возможности нашего кода или разрешать это делать другим. Способ объявить делегата следующий: delegate().