C#委托用法详解
目录
1、什么是委托
从数据结构来讲,委托是和类一样是一种用户自定义类型。
委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。
2、委托的定义
委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。
委托的声明原型是
delegate <函数返回类型> <委托名> (<函数参数>)
例子:public delegate void MyDelegate(int number);//定义了一个委托MyDelegate,它可以注册返回void类型且有一个int作为参数的函数
3、委托的实例化
3.1 使用new关键字
委托实例化的原型是
<委托类型> <实例化名>=new <委托类型>(<注册函数>)
例子:MyDelegate _MyDelegate=new MyDelegate(CheckMod);//用函数CheckMod实例化上面的MyDelegate 委托为_MyDelegate
3.2 使用匿名方法
<委托类型> <实例化名>=delegate(<函数参数>){函数体};
3.3 使用Lambda表达式
class Program
{
//声明委托
delegate int MyDelegate(int x, int y);
static void Main(string[] args)
{
//实例化委托
//1、使用new关键字
MyDelegate _myDelegate = new MyDelegate(GetSum);
//2、使用匿名方法
MyDelegate myDelegate = delegate(int x, int y)
{
return x + y;
};
//3、使用Lambda表达式
MyDelegate myDelegateLambda = (int x, int y) => { return x + y; };
}
static int GetSum(int x, int y)
{
return x + y;
}
}
4、泛型委托
委托也支持泛型的使用
泛型委托原型:
delegate
例如:delegate T2 DelegateDemo
static boo Check(int i)
{
if(i%2==0)
{
return true;
}
return false;
}
static void Main(string[] args)
{
DelegateDemo
Console.WriteLine(_delegate(9));//false
}
5、C#内置泛型委托
C#共有3种内置泛型委托
namespace DelegateDemo
{
class Program
{
//声明委托
delegate int MyDelegate(int x, int y);
static void Main(string[] args)
{
//1、Action
Action
_action("Hello World");
//2、Fun
Func
_func(5);
//3、Predicate:此委托返回一个bool值,该委托通常引用一个"判断条件函数"。
//需要指出的是,判断条件一般为“外部的硬性条件”,比如“大于50”,而不是由数据自身指定,如“查找数组中最大的元素就不适合”。
Predicate
//使用Lambda表达式
Predicate
_predicate(26);
}
static void SayHello(string strMsg)
{
Console.WriteLine(strMsg);
}
//返回值为bool值
static bool Check(int i)
{
if (i % 2 == 0)
{
return true;
}
return false;
}
}
}
6、多播委托
实例化委托时必须将一个匹配函数注册到委托上来实例化一个委托对象,但是一个实例化委托不仅可以注册一个函数还可以注册多个函数,注册多个函数后,在执行委托的时候会根据注册函数的注册先后顺序依次执行每一个注册函数。
函数注册委托的原型:
<委托类型> <实例化名>+=new <委托类型>(<注册函数>)
例如:MyDelegate _myDelegate+=new MyDelegate(CheckMod);//将函数CheckMod注册到委托实例_checkDelegate上
在.net 2.0开始可以直接将匹配的函数注册到实例化委托:
<委托类型> <实例化名>+=<注册函数>
例如:MyDelegate _myDelegate+=CheckMod;//将函数CheckMod注册到委托实例_myDelegate上
注意:委托必须先实例化以后,才能使用+=注册其他方法。如果对注册了函数的委托实例从新使用=号赋值,相当于是重新实例化了委托,之前在上面注册的函数和委托实例之间也不再产生任何关系。
有+=注册函数到委托,也有-=解除注册
例如:MyDelegate _myDelegate-=CheckMod;
如果在委托注册了多个函数后,如果委托有返回值,那么调用委托时,返回的将是最后一个注册函数的返回值。
namespace DelegateDemo
{
class Program
{
//声明委托
delegate int MyDelegate(int x, int y);
static void Main(string[] args)
{
MyDelegate _myDelegate = new MyDelegate(fun1);
_myDelegate += fun2;
Console.WriteLine(_myDelegate(10,23));
Console.ReadKey();//输出10,返回最后一个注册函数的返回值
}
static int fun1(int x, int y)
{
return x + y;
}
static int fun2(int x, int y)
{
return x;
}
}
}
到此这篇关于C#委托用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- .NET Core系列之MemoryCache 初识
- 007手机一键Root(安机网一键Root) v3.0 官方最新版 一键ROOT您的Android手机
- 12306密码被盗了怎么办?12306密码外泄解决方法
- 12个字的qq网名
- 150M迷你型无线路由器怎么设置?
- 192.168.1.1打不开怎么办?路由器192.168.1.1打不开的原因以及解决办法
- 2011年电子报合订本 电子报 编辑部 中文 PDF版 [84M]
- 2015年1月15日小米新旗舰发布会现场图文直播
- 2016.3.1vivo Xplay5新品发布会现场视频直播 优酷直播
- 2016华为P9发布会视频直播地址 4月15日华为P9国行发布会直播