C#中的委托数据类型简介

2019-12-30 11:50:20于丽


class Program
{
public delegate int Handler(int x, int y); //---定义委托的类型,可以将委托看成一种特殊的数据类型
static void Main(string[] args)
{ 
deleMethod dm = new deleMethod(); //---实例化包含委托方法的类型
Handler deleCall = new Handler(dm.add); //---定义委托变量delCall,并出示化赋值
int result1 = deleCall(10, 20); //---实例方法的调用invoke
Console.WriteLine("the add resutl is:{0}", result1);
deleCall = dm.minus;
int result2 = deleCall.Invoke(12, 6);
Console.WriteLine("the minus result is:{0}", result2);
Console.ReadLine();
}
} 

如上例所示,定义一个简单的加、减功能如此的复杂,搅来搅去让人头,真是无语,难怪很多朋友谈委托色变晕。在实际使用的过程中,c#还是有很多方式帮我们简化代码。

简化委托

预定义的泛型委托

c#系统最常见的预定义的委托类型有三种,Func<>委托、Action<>委托、Predicate<>委托,Func<>委托是一个有返回值的委托,输入参数可以多达16个;而Action<>委托是一个没有返回值的委托,它的输入参数也可以多达16个;而Predicate<>是一个具有bool返回类型的委托,它只运行一个输入参数。对于有上例的委托类型,我们可以使用预定义的委托类型Fun<int,int,int>来代替,省去我们自己定义一个什么鬼东西 public delegate int Handler(int x,int y)类型,其代码其实可以简化为如下例所示:


namespace DelegateDemo1
{
class Program
{
static void Main(string[] args)
{
deleMethod dm = new deleMethod();
Func<int, int, int> fun = dm.add; //---使用预定义的委托类型Func<>
int result4 = fun(8, 10);
Func<int, int, int> fun1 = dm.minus;
int result5 = fun1(12, 8);
Console.WriteLine("预定义的委托输出{0},{1}", result4, result5);
Console.ReadLine();
}
}
class deleMethod
{
public int add(int x, int y)
{
return x + y;
}
public int minus(int x, int y)
{
return x - y;
}
public int multi(int x, int y)
{
return x * y;
}
}
}

我把委托的方法定义和委托的调用放在一起看,是不是比原先自己定义的一个委托类型简单方便一些?但是这样使用委托还是不怎么清爽,估计在实际应用中很少人会怎么写代码,太不方便了。

匿名委托

当委托实例的调用和委托方法的定义分开处理,码农们在读程序代码的时候需要来回的去找委托方法去匹配委托变量,看看参数列表和返回值是否正确,这样的程序代码的可读性很差。其实c#还是有方法让我们简化代码:那就是匿名委托,将方法体直接在委托的实例化时给出,之所以叫匿名委托就是再定义委托的时候省略掉委托的名称,它的定义语法是delegate(参数1,参数2) 后面直接就给出方法体,用大括号将方法体括起。刚看起来比较怪异,接触多了也就习惯了,莫有办法只能去适应c#的语法规范。话说多了是水,还不如看代码来得直接。