动态、对象、变量

Posted

技术标签:

【中文标题】动态、对象、变量【英文标题】:Dynamic, Object, Var 【发布时间】:2011-09-20 03:24:29 【问题描述】:

随着 dynamic 类型和 .NET 4 中 DLR 的出现,我现在在声明我所谓的“开放”类型时有 3 个选项:

var,局部隐式类型强调“什么”而不是“如何”, objectSystem.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,它没有您将使用的任何此类成员,在这种情况下,泛型会更受欢迎

【讨论】:

以上是关于动态、对象、变量的主要内容,如果未能解决你的问题,请参考以下文章

使用变量动态访问对象属性

使用变量动态访问对象属性

使用变量动态访问对象属性

Python的动态类型

react 对象动态添加属性 setState

python动态类型