委托就像一个中间代理,通过引用这个委托对象,就可以调用被这个委托对象所引用的方法,也就是它所带的方法参数。可以调用它引用的方法,而不用管这个方法的哪个类的,因为已经通过这个委托对象去引用这个类的方法了,即我们调用这个方法是通过这个委托中间代理来实现的。有一点好处就是委托它是面向对象的,而且类型安全的。看以下代码:
class 委托人
{
public string invokedmethod() //注意此方法返回string,与委托对象相同,所要委托的事
{
Console.WriteLine("Hello");
}
}
class 类
{
委托人 classobj = new 委托人();
delegate string 被委托人(); //声明一个返回类型为string的委托对象
被委托人 deleobj=new 被委托人(classobj.invokedmethod);//创建一个带有方法的委托对象
deleobj();
}
委托通常与事件一起结合使用。事件是对用户动作的处理,当用户有某种动作的时候,通过委托对象来执行,因此,事件是通过委托来声明的。事件可以使用任何类型的委托,但有一点要注意,就是在使用组件时要遵循一些规则:事件使用的委托类型应有两个参数,一个是对象源,一个是e参数。对象源表示事件发生的源 ; e表示封装该事件的一些信息,这个e是从EventArgs类派生出来的。事件处理程序其实就同系统已定义的按钮点击事件,只不过这一次是由我们自己来定义而已。关于委托与事件的例子,参照http://blog.csdn.net/jabby12/archive/2004/08/02/58901.aspx
Delegate简单示例//********************************************/
/* Delegate Sample
/*
//******************************************************************/
using System;
namespace EventTest
{
//事件类
public class EventClass
{
public void display(object sender,System.EventArgs e)
{
Console.WriteLine("This is the Event Class");
Console.ReadLine();
}
}
//调用类
class InvokeClass
{
//声明代理对象,注意参数
public delegate void delegateobj(object sender,System.EventArgs e);
//声明事件对象
private event delegateobj obj;
//声明要调用的事件类对象
private EventClass ec;
public InvokeClass()
{
ec=new EventClass();
//添加事件对象到事件队列中,参数为要调用的事件
this.obj+=new delegateobj(ec.display);
}
//调用delegate对象触发事件
protected void OnObj(System.EventArgs e)
{
if(this.obj!=null)
{
obj(this,e);
}
}
public void RaiseEvent()
{
EventArgs e=new EventArgs();
OnObj(e);
}
static void Main(string[] args)
{
InvokeClass ic=new InvokeClass();
Console.WriteLine("Please input a string");
string input=Console.ReadLine();
if(input.Equals(""))
{
Console.WriteLine("Sorry,you don't input anything");
}
else
{
//触发事件
ic.RaiseEvent();
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现