[.NET] 《Effective C#》快速笔记_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > [.NET] 《Effective C#》快速笔记

[.NET] 《Effective C#》快速笔记

 2017/5/8 5:31:34  C# 中的动态编程(初稿)  程序员俱乐部  我要评论(0)
  • 摘要:《EffectiveC#》快速笔记-C#中的动态编程静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作。C#是一种静态类型的语言,不过它加入了动态类型的语言特性,可以更高效地解决问题。本系列《EffectiveC#》快速笔记(一)-C#语言习惯《EffectiveC#》快速笔记(二)-.NET资源托管《EffectiveC#》快速笔记(三)-使用C#表达设计《EffectiveC#》快速笔记(四)-使用框架《EffectiveC#
  • 标签:笔记 .net C# net

《Effective C#》快速笔记 - C# 中的动态编程

 

  静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作。C# 是一种静态类型的语言,不过它加入了动态类型的语言特性,可以更高效地解决问题。  

 

本系列

  《Effective C#》快速笔记(一)- C# 语言习惯

  《Effective C#》快速笔记(二)- .NET 资源托管

  《Effective C#》快速笔记(三)- 使用 C# 表达设计

  《Effective C#》快速笔记(四) - 使用框架

  《Effective C#》快速笔记(五) - C# 中的动态编程

 

一、目录

  • 三十八、理解动态类型的优劣
  • 三十九、使用动态类型表达泛型类型参数的运行时类型
  • 四十、将接受匿名类型的参数声明为 dynamic
  • 四十一、用 DynamicObject 或 IDynamicMetaObjectProvider 实现数据驱动的动态类型
  • 四十二、如何使用表达式 API
  • 四十三、使用表达式将延迟绑定转换为预先绑定
  • 四十四、尽量减少在公有 API 中使用动态类型

 

三十八、理解动态类型的优劣

  1.当你需要不知道具体类型的运行时解析方法的时候,动态类型是最佳的工具。

  2.C# 动态类型是为了让静态代码能够更加平滑地与其他使用动态类型的环境进行交互,而不是鼓励在一般场景中使用 dynamic 进行动态编程。

  2.优先使用静态类型,静态类型比动态类型更高效,动态类型和在运行时创建表达式树都会带来性能上的影响,即便这点影响微不足道。

  3.若你能控制程序中所有涉及的类型时,可以引入一个接口,而不是动态类型,即基于接口编程,并让所有需要支持该接口行为的类型都实现该接口。通过 C# 类型系统可以减少代码在运行时所产生的错误,编译器也能够生成更加高效的代码。

 

三十九、使用动态类型表达泛型类型参数的运行时类型

  1.System.Linq.Enumerable.Cast<T> 将序列中的对象转换成 T,从而使得 LINQ 可以配合 IEnumerable 进行工作;

  2.Convert<T> 要比 Cast<T> 适用性更广,但同时也会执行更多的工作。

 

四十、将接受匿名类型的参数声明为 dynamic

  1.不要过度使用动态类型,因为动态调用会增加系统的额外开销,即便不大。

  2.长远来看,具体类型更易于维护,编译器和类型系统也会为其提供更好的支持。

  3.扩展方法不能基于动态对象定义。

 

 

四十一、用 DynamicObject 或 IDynamicMetaObjectProvider 实现数据驱动的动态类型

  1.创建带有动态功能的类型的最简单的方法就是继承 System.Dynamic.DynamicObject。若能直接继承 DynamicObject,那么创建动态类就会比较简单。

  2.实现 IDynamicMetaObjectProvider 就意味着需要实现方法 GetmetaObject()。

  3.创建动态类型时首选继承,如果必须使用其他基类,可以手工实现 IDynamicMetaObjectProvider 接口,虽然所有的动态类型都会带来性能上的损失,但这种手工实现接口的方式所带来的损失往往更大一些。

 

四十二、如何使用表达式 API

  1.传统的反射 API 可以用表达式和表达式树进行更好的替代,表达式可以直接编译为委托。

  2.接口使我们可以得到一个更为清晰、也更具可维护性的系统,反射是一个很强大的晚期绑定机制,.NET框架使用它来实现 Windows 控件和 Web 控件的数据绑定。

 

四十三、使用表达式将延迟绑定转换为预先绑定

  1.延迟绑定API要使用符号(symbol)信息来实现,而预先编译好的 API 则无需这些信息,表达式 API 正是二者之间的桥梁。

  2.延迟绑定常见于 Silverlight 和 WPF 中使用的属性通知接口,通过实现 INotifyPropertyChanged 和 INotifyPropertyChanging 接口来实现属性变更的预绑定。

 

四十四、尽量减少在公有 API 中使用动态类型

  1.优先使用 C# 的静态类型,并尽可能地降低动态类型的作用范围。若是想一直使用动态特性,你应该直接选用一种动态语言,而非 C#。

  2.若要在程序中使用动态特性,请尽量不要在公有接口中使用,这样会将动态类型限制在一个单独的对象(或类型)中。

 

 

 


【博主】反骨仔

【原文】http://www.cnblogs.com/liqingwen/p/6816100.html

【GitHub】https://github.com/liqingwen2015/XMind 可以下载 XMind

【参考】《Effective C#》

 【参考】http://blog.csdn.net/w174504744/article/details/50562109

发表评论
用户名: 匿名