C# 委托
C#委托
Firstly,let us look back on function pointer in c, the following is an example.

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int (*Test)(int l); //定义函数指针
int Add(int t)
{
return t+t;
}
int Mut(int t)
{
return t*t;
}
//把函数做参数
int test2(int t,int (*p)(int))
{
return p(t);
}
int _tmain(int argc, _TCHAR* argv[])
{
char input[8];
printf("Please Input a Number!\n");
scanf("%s",input);
int t=atoi(input);
int p;
if(t>10)
{
Test=Add; //指针执行Add
}
else Test=Mut; //指针指向Mut
p=Test(t); //通过指针调用
printf("The Result is %d\n",p);
if(t>10)
{
p=test2(t,Add);
}
else p=test2(t,Mut);
printf("The Result is %d\n",p);
system("pause");
return 0;
}
一、委托
委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。
委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。
二、例子:
delegate int NumOpe(int a,int b); //第一步,声明委托
class Class1
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
NumOpe d1 = new NumOpe(c1.Add);//委托实例化,注意参数是要使用的方法名,且不带括号
Console.WriteLine(d1(1, 2));//委托调用
Console.Read();
}
private int Add(int num1, int num2)
{
return (num1 + num2);
}
} */
/*例中,委托NumOpe引用了方法Add
委托声明了以后,就可以像类一样进行实例化,委托本身就是处在类级别上的 。实例化时把要引用的方法作为参数,这样
委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致。
1、参数个数、类型、顺序必须完全一致。
2、返回值必须一致。
**/
/*
下面再看一个委托的示例。
* */
public delegate void PrintHandler(string str);//声明委托类型
public class PrintStr
{
public void CallPrint(string input)
{
Console.WriteLine(input);
}
public void CallPrint1(string input)
{
Console.WriteLine(input);
}
}
class Program
{
static void Main1(string[] args)
{
PrintStr myPrinter = new PrintStr();
PrintHandler myHandler = null;
//将委托链接到方法,来实例化委托
myHandler += new PrintHandler(myPrinter.CallPrint);
myHandler += new PrintHandler(myPrinter.CallPrint1);
//不使用“=”是因为这样会覆盖掉以前注册的方法
if (myHandler != null)
{
myHandler("Hello World!"); //调用委托,相当于匿名调用委托所链接的方法
}
myHandler -= new PrintHandler(myPrinter.CallPrint);
if (myHandler == null)
{
Console.WriteLine("myHandler==null");
}
else
{
myHandler("最后的一个方法");
myHandler -= new PrintHandler(myPrinter.CallPrint1);
Console.WriteLine("把最后的一个也去掉");
if (myHandler == null)
{
Console.WriteLine("myHandler==null");
}
else Console.WriteLine("还有一个");
}
Console.Read();
}
}//那什么时候该使用委托呢?一个经典回答:若A变动,一系列的B,C,D,E,F将变动,可使用委托。
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述