c#-délégué
Qu'est-ce que la délégation
Délégué 函数指针
oui 升级版
. C# utilise des délégués pour exécuter des fonctions de pointeur de fonction dans le langage C/C++. Par rapport aux pointeurs de fonction, les délégués peuvent exécuter davantage de fonctions.
Si vous êtes familier avec Java, vous constaterez que Java n'a ni délégués ni pointeurs de fonction. En Java, Java utilise des interfaces pour réaliser cette opération, surtout après Java 8 函数式接口
, l'intention est plus évidente.
Les méthodes peuvent être appelées indirectement à l’aide de délégués.
委托滥用会造成灾难
, donc en C#, vous pouvez apprendre à utiliser les interfaces Java pour exécuter certaines fonctions déléguées.
Utiliser des délégués prédéfinis par le système
Action
L'action est un délégué à une méthode sans valeur de retour et une liste de paramètres vide.
class Pragram
{
static void Main(string[] args)
{
Calc calc = new Calc();
Action action = new Action(calc.PrintInfo);
// 委托调用
action.Invoke();
action(); // 简洁写法
}
}
class Calc
{
public void PrintInfo()
{
Console.WriteLine("class Calc.");
}
}
Fonction
Il existe 17 types génériques dans Func, qui sont utilisés pour correspondre à des méthodes avec un nombre différent de listes de paramètres.
Func<out TResult>
La structure de méthode correspondante est la suivante : TResult Method(){...}
, TResult est un type de valeur de retour générique
Func<in T, out TResult>
⇒ TResult Method(T a){...}
Func<in T1, in T2, out TResult>
⇒ TResult Method(T1 a, T2 b){...}
…
class Pragram
{
static void Main(string[] args)
{
Calc calc = new Calc();
Func<int, int, int> func1 = new Func<int, int, int>(calc.Add);
Func<int, int, int> func2 = new Func<int, int, int>(calc.Sub);
int a = 100;
int b = 200;
int res;
res = func1(a, b); // 调用calc.Add方法
Console.WriteLine(res); // 输出300
res = func2(a, b); // 调用calc.Sub方法
Console.WriteLine(res); // 输出-100
}
}
class Calc
{
public int Add(int a, int b)
{
return a + b;
}
public int Sub(int a, int b)
{
return a - b;
}
}
Délégué personnalisé
Déclaration de délégation
Un délégué est une classe et une classe est un type de données, donc un délégué est également un type de données.
Le format général de la déclaration est le suivant :
访问修饰符 delegate 返回值类型 委托名称(参数列表);
// 声明委托
public delegate void SayHi(string name);
class Pragram
{
static void Main(string[] args)
{
SayHi sayHi = new SayHi(Hi);
sayHi.Invoke("张三");
}
static void Hi(string name)
{
Console.WriteLine("Hi, {0}", name);
}
}
Utiliser des délégués
Généralement, les façons correctes d'utiliser les délégués sont 回调函数
( qu'est-ce qu'une fonction de rappel ) et 模板方法
( qu'est-ce qu'une méthode modèle ).
délégation de multidiffusion
public delegate void SayHi(string name);
class Pragram
{
static void Main(string[] args)
{
SayHi sayHi1 = new SayHi(Hi1);
SayHi sayHi2 = new SayHi(Hi2);
SayHi sayHi3 = new SayHi(Hi3);
sayHi1 += sayHi2;
sayHi1 += sayHi3;
sayHi1.Invoke("张三"); // sayHi2和sayHi3同样会被调用
}
static void Hi1(string name)
{
Console.WriteLine("Hi1, {0}", name);
}
static void Hi2(string name)
{
Console.WriteLine("Hi2, {0}", name);
}
static void Hi3(string name)
{
Console.WriteLine("Hi3, {0}", name);
}
}
Appels asynchrones implicites
BeginInvoke
Des appels asynchrones implicites peuvent être effectués à l'aide de méthodes déléguées .
public delegate void SayHi(string name);
class Pragram
{
static void Main(string[] args)
{
SayHi sayHi1 = new SayHi(Hi1);
SayHi sayHi2 = new SayHi(Hi2);
SayHi sayHi3 = new SayHi(Hi3);
sayHi1.BeginInvoke("张三", null, null);
sayHi2.BeginInvoke("李四", null, null);
sayHi3.BeginInvoke("王五", null, null);
}
static void Hi1(string name)
{
Console.WriteLine("Hi1, {0}", name);
}
static void Hi2(string name)
{
Console.WriteLine("Hi2, {0}", name);
}
static void Hi3(string name)
{
Console.WriteLine("Hi3, {0}", name);
}
}