什么是C# 委托?这篇文章让你困惑全摆脱( 三 )


Action 是一个不具有返回类型的方法,他的类型参数数量同样多达16个 。下面展示了部分Action类型参数:
 csharp
delegate void Action;
delegate void Action<in T> (T t);
delegate void Action(in T1,in T2)(T t1,T t2);
我们来看一下例子,以Func为例,Action同理
 csharp
class Demo
{
public void Num<T>(T[] array, Func<T, T> func)
{
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(func(array[i]));
}
}
}
class Program
{
static void Main(string[] args)
{
Demo demo = new Demo;
int array = new int {2,4,6 };
demo.Num<int>(array, NumAdd);
Console.ReadLine;
}
static int NumAdd(int num)
{
return ++num;
}
}
从代码中可以看出,我们将 Demo 类中的 Num 方法的第二个参数类型写成了 Func<T,T>,这里的意思是委托实例的返回类型和类型参数都是T类型 。我们在Main函数中通过委托,控制台输出结果是3、5、7。这时我们就看出了使用 Func 和 Action 的优点了,我们不需要在外部显式的定义委托,比较方便 。
 
6.冷知识 
1. 委托与接口
一般来说接口可以解决的问题,委托同样也可以解决,那么什么时候使用委托呢?我们来看一下:
(1)当需要多播的时候;
(2)订阅者需要多次实现接口的时候 。
2. 委托兼容性
(1)委托类型
委托类型之间互不兼容,即使它们的签名一样也不行,也就是说如下的写法是错误的 。
 csharp
delegate void DD1;
delegate void DD2;
DD1 dd1=Method;
DD2 dd2=dd1;
(2)委托实例
如果委托实例具有相同的方法目标,那么委托实例就是相等的 。
(3)参数
当调用一个方法时,提供的参数可以比方法参数更具体 。例如被调用的方法参数是 Object类型,但是提供的参数是 String 类型,这时程序不会报错,因为string 来自 object,string 比 object 更具体 。(委托只支持引用转换)
(4)返回值
同参数一样,当调用方法时,可以获得一个比被调用方法返回值更具体的返回值 。
作者简介:朱钢,笔名羽生结弦,CSDN博客专家,.NET高级开发工程师,7年一线开发经验,参与过电子政务系统和AI客服系统的开发,以及互联网招聘网站的架构设计,目前就职于北京恒创融慧科技发展有限公司,从事企业级安全监控系统的开发 。
【End】

【什么是C# 委托?这篇文章让你困惑全摆脱】


推荐阅读