c#重要特性之–委托与Lambda表达式(初识)
前言:
首先毋庸置疑委托这一特性解决的问题就是代码一定程度上的可扩展性的问题,那么我们知道一切可以高扩展的东西首先他必须是足够抽象的,像我们的接口一样,我们可以进行自己的实现,其实在我看来委托也是一样的,只不过相较于接口来说他的限制条件有一些变化。
委托的定义
声明一个委托:
public delegate string delegateModel(int a1, int a2);
这样我们就完成了一个委托的创建,那么我们怎么去使用他呢?
首先我们之前说的和接口类似委托其实也是只是定义了一个规则,那么我们应该首先做的是定义一个实现去具体这个规则,我们需要遵循的条件是什么呢?首先作为委托只看两点 1.参数 2.返回值 其他都可以不一样只要是这两样和委托的方法体一致或者兼容即可。
public static void CallDelegateAndThen(int[] items, delegateModel delegateModel)
{//逻辑实现按
}
public static string delegateModelImpl(int a1, int a2){
return (a1 + a2).ToString();
}
像上面这样我们就实现了委托的简单实现当我们进行CallDelegateAndThen方法的调用的时候我们就可以不局限于某一个实现进行,也更加符合我们的依赖导致原则。
Lambda表达式:
lambda表达式对于我们来说并不陌生了,java中也有lambda表达式,那么在c#中lambda表达式通常情况之下是进行委托的创建,也就是像这样:
public class DegelateClass
{
public delegate void delegateModel01(int a1, string s1);
}
我们声明这样一个类,当我们想实现这个委托的时候我们只需要使用lambda表达式进行一个匿名的实现即可,就像这样:
CallMethod(args1,(参数)=>{ 逻辑,返回值})
避免我们进行方法或者类的创建,目前我们使用最多的委托类就是Ac’tion以及Func了,
一个是有返回值的一个是没有返回值的,当然这些我们都可以自己定义。
public delegate void Action();
public delegate TResult Func<out TResult>();
我的看法
其实我觉得这个委托和java中的接口更为相近,我们在java中一个只有一个抽象方法的接口叫做函式接口,当我们想要在方法中进行实现类似的调用的时候也是可以使用这种lambda表达式的方式进行实现,也就是我们所说的匿名内部类的方式,以上就是简单的介绍了一下c#中的委托。