某人

此前素未谋面、此后遥遥无期

0%

c#中的委托和事件

委托

委托(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类作为参数。

未完待续…