委托
委托(Delegate)都派生自 System.Delegate 类
委托(Delegate)特别用于实现事件和回调方法
委托可以叫为函数指针
c#委托-博客园传送
写的很详细,我参考抄的学习一下,希望作者不要嫌弃
委托信息
委托的声明
定义委托相当于声明了一个类,类如果不实例化为对象,很多功能是没有办法使用的,委托也是如此.
1 2
| <委托类型> <实例化名> = new <委托类型>(<注册函数>) public delegate void TestDelegate(int number);
|
委托的实例化
1 2 3 4 5 6 7
| 方法一: <委托类型> <实例化名>=new <委托类型>(<注册函数>) TestDelegate _testDelegate=new TestDelegate(Method);
方法二: <委托类型> <实例化名>=<注册函数> TestDelegate _testDelegate=Method;
|
用匿名函数初始化委托
方法一:
<委托类型> <实例化名>=new <委托类型>(delegate(<函数参数>){函数体});
方法二:
<委托类型> <实例化名>=delegate(<函数参数>){函数体};
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| delegate void Test1(int i); delegate int Test2(int j);
Test1 t1 = new Test1(delegate(int i) { print(i); });
//调用方法 private void TestDelegate() { Test2 t2 = delegate(int j) { return j; };
t1(5); print(t2(10)); }
|
泛型委托
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| /* * T2作为函数返回类型 * T1作为委托函数的参数类型 */ delegate T2 Test<T1, T2>(T1 t); private int TestAdd(int i) { return i; }
//调用 private void TestDelegate() { Test<int, int> t = TestAdd; print(t(20)); }
|
委托的多播
委托的多播(Multicasting of a Delegate)
使用 “+=” 运算符进行合并
使用 “-=” 运算符进行移除
对注册了函数的委托实例重新使用=号赋值,相当于是重新实例化了委托
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| delegate int Calculate(int i); private static int num = 10; private int AddNum(int p) { return num += p; }
private int MultNum(int q) { return num *= q; }
private int GetNum() { return num; }
//调用 private void TestDelegate() { Calculate c; Calculate c1 = AddNum; Calculate c2 = MultNum;
c = c1; c += c2;
//调用多播 => 24 c(2);
print(GetNum()); }
|
事件event
事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。
event 关键字用于在发行者类中声明事件
所有的事件参数类都必须从 System.EventArgs类派生。
事件不含参数,可以直接用System.EventArgs类作为参数。
未完待续…