码迷,mamicode.com
首页 > 其他好文 > 详细

委托和委托链

时间:2015-04-30 15:50:59      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

1、委托是一种类型,声明一个委托的时候有点像创建一个方法,我们下面两个例子都用的委托,代码如下,eg:

public delegate int MyDelegate1(int i);

示例代码,eg:

 1 public Form3()
 2 {
 3     InitializeComponent();
 4 }
 5 public int F1(int i)
 6 {
 7     return 1;
 8 }
 9 public int F2(int i)
10 {
11     return 2;
12 }
13 public int F3(int i)
14 {
15     return 3;
16 }
17 public int F4(int i)
18 {
19     return 4;
20 }
21 
22 private void Form3_Load(object sender, EventArgs e)
23 {
24     MyDelegate1 myDelegate1 = F1;
25     Console.WriteLine(myDelegate1.Invoke(2));//本质是通过invoke调用,不过可以写成下面的简写方式
26     Console.WriteLine(myDelegate1(2));//简写形式            
27 }

 

2、委托链可以增加方法,可以移除方法,如果是无返回值的方法,我们把它们都绑定到一个委托上面的话,直接调用,那么调用此委托就会依次调用其中的方法;但是如果是多个有返回值的委托链,如果我们不采用特殊手段,直接调用的话,会返回最后一个方法的值,那么我们只能通过下面的方法来实现了,下面方法的本质也是一个个的调用其中的方法,使用GetInvocationList()来获取多播中的单独委托然后一个一个的执行然后我们可以把值存放到一个数组或者list泛型中去。具体代码如下,eg:

public int F1(int i)
{
    return 1;
}
public int F2(int i)
{
    return 2;
}
public int F3(int i)
{
    return 3;
}
public int F4(int i)
{
    return 4;
}
MyDelegate1 myDelegate1 = F1;
myDelegate1 += F2;
myDelegate1 += F3;
myDelegate1 += F4;
List<int> list = new List<int>();
Delegate[] myDelegates = myDelegate1.GetInvocationList();
foreach (var myDelegate in myDelegates)
{
    MyDelegate1 m1 = (MyDelegate1)myDelegate;//注意此处需强转
    list.Add(m1.Invoke(2));//等价于list.Add(m1(2));
}
foreach (var i in list)
{
    Console.WriteLine(i);
}
Console.ReadLine();

结果输出是1,2,3,4

委托和委托链

标签:

原文地址:http://www.cnblogs.com/shoushangdeyu/p/4468848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!