永发信息网

c#dynamic 判断是对象还是值

答案:1  悬赏:0  手机版
解决时间 2021-03-28 23:17
  • 提问者网友:一抹荒凉废墟
  • 2021-03-28 04:07
c#dynamic 判断是对象还是值
最佳答案
  • 五星知识达人网友:大漠
  • 2021-03-28 04:20
dyanmic一定是对象,想都不用想,即使是值也被打包成了引用类型。
dynamic是.net 4.0+之后添加上的一个功能,它是声明动态类。这个与var的区别在于var是编译推断,而dynamic则是运行推断。所谓的编译推断指的是编译器在编译时可以推断其类型,生成的文件在反射时就已经知道其类型了。所以很多人喜欢使用var声明变量——这其实是一种不好的毛病,我们用到时自定义的类型比较多,在源码交流层上存在一定的阅读复杂度。所以尽量不要使用var,有人可能会说他不影响性能。这个分为两个方面,运行性能不会受到影响,但编译性能肯定会受到影响——更重要的是,软件管理上来说是影响一定的阅读性。也有人说写起来方便——其实一样的,在VS智能感知下,如果先打出类名,那么new的时候会有感知,如果var的话,其后new时会提示,所以难度是一样的。而针对于lambda之类的返回时,使用var确实会存在编写代些较快的时候,所以也多见于这种情况下使用。还有一种情况是不能使用的,就是我们使用里氏替换时,这个对阅读性会造成很大的困难,比如 Sharp sharp = new TripleShape(); 三角形是形成的一种,这种情况下使用var,会极大影响阅读性,而且我们要求面向切面编程的时候,往往引用的是父类或接口类,而不是具体的类,这种情况下使用var的程序员,基本上都是该死的。
再来说一下dynamic,其实他只是.net 4.0最重要特性的一个体现,这个最生要的特性就是匿名类,被dynamic声明的变化,在编译时并不知道这是一个什么类,直到运行的时候,即据你的调用反射到类中去使用对应类的成员,这对运行性能上确定也很大的影响——但编译性能上只是做了标记,反倒没有什么影响。如果不涉及到后期绑定之类的,可以直接使用匿名类,而不需要使用这种动态形式的。匿名类例如查询语句中select或lambda表达式中的select都是对对象做了投影,会生成匿名类(结果是IEnumeable,结果是匿名类的集合),而如果需要单独这个匿名类时(运行程序中),这时可以考虑使用Dynamic进行传递。如果是多个自定义类时,尽量考虑使用继承或模式的方法,比如定义A类和B类,两者有共同的一个方法名,可以定义一个动态类,程序运行某个时间这个类可能是A,也可能是B(两个类之间没有继承树关系,不直接或间接继承再一接口或对象),这时动态类在运行时就大有作用了。但在软件设计时,如果不是系统无法调用,可以考虑重构A/B使其拥有相同的继承树关系,或者使用策略模式等)方式,尽量不要使用Dynamic动态类——不仅仅是因为性能问题,对程序的维护、阅读等各个方面都存在一定的影响的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯