优秀的编程知识分享平台

网站首页 > 技术文章 正文

精通c# -- 委托(c#中委托)

nanyue 2024-10-25 13:18:47 技术文章 8 ℃

Delegate 委托类型用来定义和响应应用程序中的回调。

回调指的是可以作为参数传递给其他代码的一段可执行代码,普通代码是高层(应用程序)调用低层(系统函数、库函数),回调时则是低层函数调用高层函数。

.NET委托类型是一个类型安全的对象,指向可以以后调用的其他方法。.NET委托是内置支持多路广播和异步调用的对象。它允许内存中的对象进行双向对话。

我们可以在任何需要强类型委托的情况下指定一个代码语句(以及传入代码语句的参数),它是类型安全的。

委托包含三个信息:1.他所调用的方法名称;2.该方法的参数;3.该方法的返回值类型。

委托既可以指向静态方法,也可以指向实例方法。运行时动态调用其指向的方法。委托自己不执行,只是指向一个方法让其去执行。(需要实例化)

(例子: //委托(这个委托可以指向任意传入两个整数,返回一个整数的方法)

public delegate int daleAa(int a, int b);)

//使用委托,在实例的过程中传入方法(AA是一个类,jia是一个加法方法),直接使用方法名而不需要实例化创建对象是因为.NET提供了方法组转换。

daleAa da = new daleAa(AA.jia);

da(3, 4);

委托有三个核心的方法(CLR自动生成),Invoke(调用)用来以同步方式调用委托对象的每个方法,这里的同步指的是指调用者必须等待调用完成后才继续执行(应该是在后台自动调用??),BeginInvoke(异步调用)和EndInvoke(结束调用)能够在第二个执行线程上异步调用当前方法。

(例子: //这是单线程的操作(以线程阻塞做实验)

Console.WriteLine("");

daleAa a1 = new daleAa(AA.jia2);

int we1 = a1(10, 80);

Console.WriteLine("90=" + we1);

//多线程操作(异步调用委托),jia2也是加法,里面多一个线程阻塞

Console.WriteLine("");

daleAa a2 = new daleAa(AA.jia2);

//这两个委托的方法都是CLR动态生成的

IAsyncResult ifs = a1.BeginInvoke(10, 80, null, null);

//Console.WriteLine("主线程干别的事请,完成之后就需要等待次线程的完成,因为只有一句输出代码,所以效率并未提升");

while (!ifs.IsCompleted)

{

Console.WriteLine("用于判断异步操作是否已完成");

Thread.Sleep(1000);

}

//接收返回的值,让主线程偷走了一步

int we2 = a1.EndInvoke(ifs);

Console.WriteLine("90=" + we2);

(多路广播)一个委托对象可以维护一个可调用的列表而不是单独一个方法,给委托添加多个方法时,重载+=就可以(对委托对象使用+=操作符的时候,编译器会将该问题转换为一个对静态Delegate.Combine()方法的调用,-=操作符也是被重载过的,在这里是对Remove()的调用)。

(例子: //委托支持多路广播

da += AA.jian;

//当一个委托同时被多个方法调用时会先后执行多次,也就是说,这一次会得到两个值,先加的5+4=9,后减为5-4=1

da(5, 4);

//移除某个方法(此处为加法)

da -= AA.jia;

da(3, 8);

如果我们没有把委托成员变量定义为私有的,调用者就可以直接访问委托对象。这样调用者就可以把变量重新赋值为新的委托对象(也就是修改了当前调用的方法列表),也可以直接调用委托的调用列表。

Tags:

最近发表
标签列表