委托和委托链

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

时间: 2024-11-04 14:35:00

委托和委托链的相关文章

C# 委托之把委托从委托链(多播委托)移除

运用“-”运算符将委托从委托链移除 1 class HelloWorld 2 { 3 //定义委托类型 4 delegate void DelegationChain(); 5 static void Main(string[] args) 6 { 7 //用静态方法来实例委托 8 DelegationChain mydelegateone=new DelegationChain(HelloWorld.Fun2); 9 //用实例方法来实例委托 10 DelegationChain mydele

初识C#委托及委托链

委托是c#很重要的特性.代码如下: class Program { public delegate void DelegateTest(); static void Main(string[] args) { DelegateTest dtstatic = new DelegateTest(Program.method1);//实例化,静态方法,不用new DelegateTest dtinstance = new DelegateTest(new Program().method2);//实例

委托Delegate,多播委托和委托链

定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static CalculateDelegate mydelegate; 定义一个方法和委托绑定,注意定义的方法和委托的参数要统一 public static void Add(int 32 x,int 32 y) { console.writeline(x+y); } 将方法和委托绑定 public static void m

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

【C#进阶】多播委托和委托数组像是一回事~

这个MathOperation类有三静态方法,参数都是double,并且没有返回值,考虑用Action<>() 这种预定义的委托哦 class MathOperations { public static void MultiplyByTwo(double value) { Console.WriteLine( "2* {0} = {1}",value,value * 2); } public static void Square(double value) { Conso

委托, 泛型委托,Func&lt;T&gt;和Action&lt;T&gt;

使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyDelegate(); class Program { static void Main(string[] args) { MyDelegate d = ReturnOne; d += ReturnTwo; foreach (int i in GetAllReturnVals(d)) { Consol

分配委托、匿名委托、委托

分配委托(将命名方法分配给其委托) using System; public class GenericFunc { public static void Main() { // Instantiate delegate to reference UppercaseString method Func<string, string> convertMethod = UppercaseString; string name = "Dakota"; // Use delegat

C#委托一——委托初解

PanPen120在CSDN上原创,如其他网站转载请注意排版和写明出处: 今天一直在研究委托,因为有函数指针的基础,还容易上手,但是对于一些概念和实践,总是为了弄的非常清楚而纠结,这几篇关于委托的文章我是结合<C#与.NET4高级程序设计>.MSDN.借鉴其他人的博文来总结话语,以最直接简洁的话来阐述清楚(在我弄懂之前网上的感觉都很模糊) namespace DelegateDemo { //function1: public delegate int setMyName(string nam

C# 匿名方法 委托 Action委托 Delegate委托

原文地址:https://msdn.microsoft.com/zh-cn/library/bb882516.aspx 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式. 实例参考: 1 using System; 2 using System.Collection