重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如何理解Lambda表达式和依赖倒置,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
为云阳等地区用户提供了全套网页设计制作服务,及云阳网站建设行业解决方案。主营业务为网站设计、成都网站设计、云阳网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!Lambda表达式、依赖倒置
依赖倒置原则的实现也会在最后来粗略的讲解一下。 没有核心的主题,如果说要强制定义的话就是这些内容都是基础知识,是为了后续学习MVC框架做铺垫。
Lambda表达式在日常的开发中很常见,使用Lambda表达式可以自由的定义函数体并且精简代码量,那么Lambda表达式是什么呢?
Lambda表达式是匿名函数,而匿名函数又是委托,所以lambda表达式就是委托。(编译成中间语言后有一点小小的区别,不过大致是一样的)
1.1 Lambda的定义
既然说到Lambda是委托了,那就的有个类型,这里我们使用的是.NET给我们提供的Fun
1.2 相互认识
示例代码1.1-1
1 private bool Comparison(int num1, int num2) 2 { 3 if (num1 > num2) 4 { 5 return true; 6 } 7 else 8 { 9 return false; 10 } 11 }
1 FuncComparisonNum = new Func (Comparison); 2 Comparison(5, 3);//return true
上面的示例中明显,很简单的定义了Func
示例代码1.1-2
1 FuncComparisonNum= 2 delegate(int num1,int num2) 3 { 4 if (num1 > num2) 5 { 6 return true; 7 } 8 else 9 { 10 return false; 11 } 12 };
1 ComparisonNum(3, 5);//return false
从代码1.1-2中可以看出,使用匿名委托和上面的那个1.1-1没有什么大大的区别,只不过匿名委托简便了一点。下面再来看使用Lambda表达式的示例。
示例代码1.1-3
1 FuncComparisonNum = (num1, num2) => { return num1 > num2; };
1.1-3代码中在=>左边的"(num1,num2)"是要使用的参数,根据Func
示例代码1.1-4
1 FuncComparisonNum = (int num1,int num2) => { return num1 > num2; };
1.1-3使用的是简便的写法,因为有VS这么强大环境的支持,可以根据前面变量定义的委托类型,自动的设置为Lambda表达式参数类型,以求符合前面类型的定义,而=>的右边则是Lambda表达式的函数主体,同匿名委托一个道理。这一小节对Lambda只是作了很简单的一个示例,意在让读者基础的了解到这方面的内容,篇幅的原因就不多说了。
设计原则是在设计模式或者是框架设计中都有遵循着的。这一节就讲解一下依赖倒置原则的实现之一依赖注入。
在工作中学习中,面向抽象编程、依赖于抽象不依赖于具体这些话语是经常性的见到,本节中的示例都会涉及到这些概念,很简单的一个示例让大家有个了解。
1 public class Entity 2 { 3 }
这里先定义了一个实体类,只是用作演示,没有什么具体功能,
1 public class ObjectFactory 2 { 3 public Entity CreateObject() 4 { 5 return new Entity(); 6 } 7 }
然后又定义一个工厂,用作获取到Entity类型的实例,
1 public class IocController 2 { 3 public static Entity GetEntity() 4 { 5 ObjectFactory entityFactory = new ObjectFactory(); 6 return entityFactory.CreateObject(); 7 } 8 }
这是一个控制器,客户端在获得Entity类型的唯一依赖,在客户端只会IocController.GetEntity();这样来获得Entity实例。而我们要做的就是降低IocController和ObjectFactory的耦合度,其它的都不需要管了。
如图1
这时候的依赖关系正如上图所示的这样,那就要靠依赖抽象去解耦了。
1 public interface IObjectFactory 2 { 3 Entity CreateObject(); 4 } 5 public class ObjectFactory:IObjectFactory 6 { 7 public Entity CreateObject() 8 { 9 return new Entity(); 10 } 11 }
是的,对ObjectFactory类型进行了抽象,有了IObjectFactory接口类型。
图2
这个时候在脑海中的图形是不是应该是如图2所示的那样,想象确实是美好的,但是现实却不是这样。
1 public class IocController 2 { 3 public static Entity GetEntity() 4 { 5 IObjectFactory entityFactory = new ObjectFactory(); 6 return entityFactory.CreateObject(); 7 } 8 }
这时候的依赖关系应该是像图3这样,
图3
感觉是不是很糟糕,没关系,稍作修改,让依赖合理的注入就可以完成解耦,
1 public class IocController 2 { 3 private static IObjectFactory objectFactory; 4 5 public static void SetObjectFactory(IObjectFactory objectfactory) 6 { 7 objectFactory=objectfactory; 8 } 9 10 public static Entity GetEntity() 11 { 12 return objectFactory.CreateObject(); 13 } 14 }
这个时候的关系依赖图就像图2所示的那样了。 这里要说的就是在IocController中私有的静态字段和静态函数都可以转为实例的,在IocController中定义一个静态的IocController类型来实现自身的一个单例模式,然后调用实例方法。 因为是个示例,着重于依赖注入的解释就不完善这个类型了,就用语言描述一下, 这样的设计的思路就类似于ASP.NETMVC中ControllerBuilder的样子,也就是构造函数注入。
看完上述内容,你们掌握如何理解Lambda表达式和依赖倒置的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。