C#的委托用法

本文详细介绍了C#中的委托概念,包括其定义、声明、实例化方式(new关键字、匿名方法和Lambda表达式),以及泛型委托和多播委托的使用。重点讲解了Action、Func和Predicate等内置泛型委托的区别和Lambda表达式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(stringD args)

{

//实例化委托

//1、使用new关键字

MyDelegate - myDelegate = new MyDelegate(GetSum);

//2、使用匿名方法

MyDelegate myDelegate = delegate(int x. inty)

{

returnx + y;

};

//3、使用Lambda表达式

MyDelegate myDelegateL ambda = (intx, inty) => {returnx+y;};

}

static int GetSum(int x, int y)

{

returnx + y;

 }

}

4、泛型委托

委托也支持泛型的使用

泛型委托原型:delegate <T1> <委托名><T1,T.,3...> (T1 t1,T2 t2,T3 t3...)

例如: delegate T2 DelegateDemo<T1,T2>(T1 t);//定义两个泛型 (T1,T2) 的委托, T2作为委托函数返回类型, T1作为委托函数参数类型

static boo Check(int i)

{

if(i%2==0)

 {

return true;

 }

return false;

}

static void Main(stringl] args)

{

DelegateDemo<int, bool> _delegate =Check;

// 将泛型委托<T1,T2> 实例化为 <int,bool>, 表示有一个int类型参数且返回类型是bool的函数。

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<T>只能委托必须是无返回值的方法

Action<string>_ action = new Action<string>(SayHello);

_action("Hello World");

//2、Fun<TResult> 只是委托必须有返回值的方法 Func<int, bool>_ func = new Func<int, bool>(Check);

_func(5);

//3、Predicate:此委托返回一个bool值,该委托通常引用一个"判断条件函数”。

//需要指出的是,判断条件一般为 “外部的硬性条件",比如"大于50",而不是由数据自身指定,如“查找数组中最大的元素就不适合”。

Predicate<int>_ predicate = new Predicate<int>(Check);

//使用Lambda表达式

Predicate<int> predicate=p=>p %2== 0;

_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(CheckMd);

//将函数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(un1);_myDelegate += fun2;

Console.WriteL ine( myDelegate(10,23));

Console.ReadKeyO)//输出10,返回最后一个注册函数的返回值

}

static int fun1(int x, int y)

{

returnx + y;

}

static int fun2(int x, int y)

{

return x;

  }

 }

}

到此这篇关于C#委托用法的文章就介绍到这了。本文整合书籍和网络相关资料,作为课后作业发布。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值