手机
当前位置:查字典教程网 >编程开发 >C#教程 >基于C#委托的深入分析
基于C#委托的深入分析
摘要:1.委托的定义委托可以看成是一种数据类型,可以用于定义变量能接受的值只能是一个方法。委托简单的示例:复制代码代码如下:namespaceDe...

1.委托的定义

委托可以看成是一种数据类型,可以用于定义变量能接受的值只能是一个方法。

委托简单的示例:

复制代码 代码如下:

namespace DelegateDemo

{

class Program

{

public delegate int MathOptDelegate(int value1,int value2);

public int add(int value1, int value2)

{

return value1 + value2;

}

static void Main(string[] args)

{

MathOptDelegate mod;

Program p = new Program();

mod =p.add;

Console.WriteLine(mod(3,5));

Console.ReadKey();

}

}

}

利用委托的构造函数创建委托

复制代码 代码如下:

namespace DelegateDemo

{

class Program

{

public delegate int MathOptDelegate(int value1,int value2);

public int add(int value1, int value2)

{

return value1 + value2;

}

static void Main(string[] args)

{

Program p = new Program();

MathOptDelegate mod = new MathOptDelegate(p.add);

Console.WriteLine(mod(3,5));

Console.ReadKey();

}

}

}

从这个示例中可以得出这样的直观印象:

委托可以堪称是一个方法的容器,将某一个具体的方法装入后,就可以把它当成方法一样使用。

2.委托的调用列表

从上一个例子看,委托变量可以引用某一个方法,调用它就相当于调用这个方法。

如果委托今年仅是方法调用的另一种形式,那何必多此一举引入委托这一特性?直接调用方法不是更简单明了?

因为委托变量不仅可以引用另一个方法,还可以组合多的方法并批量执行它们。

复制代码 代码如下:

namespace DelegateDemo2

{

class Program

{

public delegate void MyDelegate(String str);

public static void hello(String str)

{

Console.WriteLine(str+"你好");

}

public static void goodbye(String str)

{

Console.WriteLine(str+"再见");

}

static void Main(string[] args)

{

MyDelegate a,b,c,d;

a = Program.hello;

a("a");

b = Program.goodbye;

b("b");

c = a + b;//等价将两个方法体合并

c("c");// c你好 c再见

d = c - a;

d("d");//d再见

Console.ReadKey();

}

}

}

像C这样的委托变量可称为多路委托变量。

可以用加法运算符来组合单个委托变量为多路委托变量。类似的,也可以使用减法运算符来从一个多路委托变量中移除某个委托变量。

复制代码 代码如下:

namespace DelegateDemo2

{

class Program

{

public delegate void MyDelegate(String str);

public static void hello(String str)

{

Console.WriteLine(str+"你好");

}

public static void goodbye(String str)

{

Console.WriteLine(str+"再见");

}

static void Main(string[] args)

{

MyDelegate a,b,c,d;

a = Program.hello;

a("a");

b = Program.goodbye;

b("b");

c = a + b;//等价将两个方法体合并

c("c");// c你好 c再见

d = c - a;

d("d");//d再见

Delegate[] ds;

ds = c.GetInvocationList();

foreach(Delegate s in ds)

{

Console.WriteLine(s);

//DelegateDemo2.Program+MyDelegate

//DelegateDemo2.Program+MyDelegate

}

Console.WriteLine(ds.Length);

Console.ReadKey();

}

}

}

如果委托定义的方法有返回值,则多路委托变量的返回值为委托调用列表中最后一个方法的返回值,中间调用的方法返回值会被丢弃。

使用泛型委托:

Func系列委托

以下是Func熄了委托的定义,依其泛型类型参数的多少有多个重载形式:

public delegate TResult Func<Tresult>();

public delegate TResult Func<T,Tresult>();

【基于C#委托的深入分析】相关文章:

学习C#静态函数及变量的一个精典例子与代码

C# 的关键字详细介绍

关于c#二叉树的实现

C# Word 类库的深入理解

基于C#中XmlReader读取Xml的深入分析

关于C#程序优化的五十种方法

Question:基于C#连续赋值的面试题(解答)

C# 获取属性名的方法

基于C#中XmlWriter写入Xml的深入分析

基于c# 类、接口、结构的联系与区别详解

精品推荐
分类导航