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

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

  • var,局部隐式类型强调“什么”而不是“如何”,
  • objectSystem.Object 的别名,以及
  • dynamic,禁用编译器检查,在运行时添加方法/属性

虽然有很多关于这些的文章,但我没有找到将它们放在一起的东西,我不得不承认,它仍然有点模糊。

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

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

谢谢!

【问题讨论】:

    标签: c# object dynamic var


    【解决方案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,它没有您将使用的任何此类成员,在这种情况下,泛型会更受欢迎

          【讨论】:

            猜你喜欢
            • 2016-11-16
            • 2012-05-18
            • 1970-01-01
            • 2015-09-23
            • 1970-01-01
            • 2021-10-25
            相关资源
            最近更新 更多