动态、对象、变量
Posted
技术标签:
【中文标题】动态、对象、变量【英文标题】:Dynamic, Object, Var 【发布时间】:2011-09-20 03:24:29 【问题描述】:随着 dynamic
类型和 .NET 4 中 DLR 的出现,我现在在声明我所谓的“开放”类型时有 3 个选项:
var
,局部隐式类型强调“什么”而不是“如何”,
object
,System.Object
的别名,以及
dynamic
,禁用编译器检查,在运行时添加方法/属性
虽然有很多关于这些的文章,但我没有找到将它们放在一起的东西,我不得不承认,它仍然有点模糊。
添加到这个 LINQ、lambda 表达式、匿名类型、反射......它变得更加不稳定。
我想看一些例子,也许是对比优势/劣势,以帮助我巩固对这些概念的理解,并帮助我理解何时、何地以及如何在它们之间进行选择。
谢谢!
【问题讨论】:
【参考方案1】:var
:我用它来保持代码简短:
而不是写:
MyFramework.MyClass.MyType myvar = new MyFramework.MyClass.MyType();
我可以保持“简短”:
var myVar = new MyFramework.MyClass.MyType();
【讨论】:
【参考方案2】:var
与写完整类型完全相同,所以当变量应该是单一类型时使用它。它经常与LINQ 一起使用,因为您经常将anonymous types 与LINQ 一起使用。
object
是所有类的根,因此当一个变量有许多不同的、不相关/不继承的实例,或者当你不知道类型和编译时间(例如反射)时,应该使用它。如果可能,一般应避免使用它。
dynamic
用于本质上是动态的对象,因为它们可以具有不同的方法和属性,这些对于与 COM 以及动态语言和特定领域语言进行交互非常有用。
【讨论】:
【参考方案3】:使用var
使您的代码更短且更具可读性,或者在使用匿名类型时:
var dict = new Dictionary<int, List<string>>();
var x = db.Person.Select(p => new p.Name, p.Age );
当动态绑定有用或需要时使用dynamic
。或者当你需要根据对象的运行时类型来决定调用哪个方法时。
尽可能少使用object
,更喜欢使用特定类型或泛型。一个有用的地方是当你有一个只用于锁定的对象时:
object m_lock = new object();
lock (m_lock)
// do something
【讨论】:
这不是匿名类型的示例(除非Name
本身就是匿名类型,我认为它不可能)。
@George,是的,已修复。我不知道我为什么这样写。【参考方案4】:
看看这个article,它给出了动态关键字的优点和限制。
【讨论】:
【参考方案5】:var
是静态类型,因此 Type
在编译和运行时是已知的(因此有助于捕获拼写错误)
dynamic
与对象非常相似,但不限于Object
方法,这里Type
是在运行时推断的,它将用于您想要实现一些动态行为的情况。
对于object
,它没有您将使用的任何此类成员,在这种情况下,泛型会更受欢迎
【讨论】:
以上是关于动态、对象、变量的主要内容,如果未能解决你的问题,请参考以下文章