c#入门-自定义委托类型

自己定义的类型

官方定义的泛型委托写了很多的重载。最高可以支持16个参数。足以满足大多数需求。
但是,泛型这个功能,无法作用到引用传递
也就是说所有的带有out/in/ref参数类型的函数都无法使用官方定义的委托类型。

此刻只能自己声明委托类型。
委托类型的声明语法是:关键字delegate+返回类型+方法名+参数列表
就像声明抽象方法一样,以分号结尾,不能带函数主体。

Parse p = int.TryParse;
Parse<int> p2 = int.TryParse;

delegate bool Parse(string s, out int i);
delegate bool Parse<T>(string s, out T t);

委托类型的声明看起来很像在声明方法。但委托类型是类型,和类同级别,可以直接声明在命名空间下
在这里插入图片描述

曾经的delegate

有些人看的过时的教程,认为必须有delegate才是委托。
这里讲一下以前的delegate的作用。

委托类型

delegate void Invoke1();//这是一个定义在命名空间下的类型。他是一个委托类型。
delegate int Invoke2(int a, int b);//这也是一个委托类型,他具有参数,返回值是int
delegate T Invoke3<T>(T a, T b);//这是一个泛型委托。他的参数和返回值都是泛型

//
// 摘要:
//     封装一个方法,该方法不具有参数,且返回由 TResult 参数指定的类型的值。
//
// 类型参数:
//   TResult:
//     此委托封装的方法的返回值类型。
//
// 返回结果:
//     此委托封装的方法的返回值。
public delegate TResult Func<out TResult>();//这是系统自己定义的委托

委托值

Func<string> fun1 = Console.ReadLine;//这个东西可以给委托类型赋值,所以他是委托值。
Func<string> fun2 = () => "666";//这是一个匿名委托,他也是委托值
Func<string> fun3 = delegate ()//这是曾经的匿名委托语法。必须使用delegate并指定完全的参数和函数主体。
{
	return "666";
};

传入委托参数

void Invoke(Func<int, int, int> func)//这个函数需要一个委托类型的参数
{

}
Func1<int, int, int> func = Math.Min;
Invoke(func);//我可以声明一个委托变量,然后把变量传入进去。

Func<int, int, int> func2 =(a,b)=>a;
Invoke(func2);//现在我改用匿名委托为委托变量赋值。

Invoke((a, b) => a);//变量是值的容器,所以我跳过声明变量这一步,直接把值传进去。

Invoke(delegate (int a, int b) { return b; });//而这,就是曾经必须加delegate的写法。

在今天,lambda表达式形式的匿名委托已经完全可以代替delegate语法的匿名委托,并且写法更短。
他们的作用是一样的,所以并不是必须要delegate才叫委托。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值