动态,对象,Var

时间:2011-06-22 07:11:01

标签: c# object dynamic var

随着dynamic类型和.NET 4中的DLR的诞生,我现在有3个选项来声明我称之为“开放”类型:

  • var,本地隐式类型强调'what'而不是'how',
  • objectSystem.Object的别名和
  • dynamic,禁用编译器检查,在运行时添加方法/属性

虽然有很多关于这些内容的文章,但我发现的并没有把它们放在一起,我不得不承认,它仍然有点模糊。

添加到这个LINQ,lambda表达式,匿名类型,反射......它变得更加不稳定。

我希望看到一些例子,也许是对比优势/劣势,帮助我巩固对这些概念的把握,并帮助我理解我应该在何时,何地以及如何在它们之间进行选择。

谢谢!

5 个答案:

答案 0 :(得分:5)

  • 使用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
    }
    

答案 1 :(得分:3)

var与编写完整类型完全相同,因此当变量应该是单一类型时使用它。它通常与LINQ一起使用,因为您经常将anonymous types与LINQ一起使用。

object是所有类的根,因此当变量具有许多不同的,不相关/未继承的实例时,或者当您不知道类型广告编译时(例如反射)时,应该使用它。如果可能的话,通常应该避免使用它。

dynamic适用于本质上是动态的对象,因为它们可以具有不同的方法和属性,这些对于与COM以及动态语言和域特定语言交互非常有用。

答案 2 :(得分:2)

var:我用它来保持代码简短:

而不是写作:

MyFramework.MyClass.MyType myvar = new MyFramework.MyClass.MyType();

我可以保持“短”:

var myVar = new MyFramework.MyClass.MyType();

答案 3 :(得分:1)

var是静态类型,因此Type在编译和运行时是已知的(因此有助于捕获拼写错误)

dynamic非常类似于对象,但不限于Object方法,此处Type在运行时推断,它将用于您想要的情况实现一些动态行为。

好吧object它没有你会使用的任何此类成员,在这种情况下,Generics会更受欢迎

答案 4 :(得分:0)

看看这个article它给出了Dynamic关键字的优点和局限。