动态、对象、变量

7
随着.NET 4中的dynamic类型和DLR的出现,我现在有三种选项来声明我所谓的“开放”类型:
  • var,本地隐式类型强调“what”而不是“how”,
  • objectSystem.Object的别名,以及
  • dynamic,禁用编译器检查,在运行时添加方法/属性
虽然有很多关于这些内容的文章,但我没有找到把它们放在一起的文章,我必须承认,这些还有点模糊。
再加上LINQ、lambda表达式、匿名类型、反射等等...就更加不稳定了。
我想看到一些例子,也许对比优缺点,以帮助我巩固对这些概念的理解,同时帮助我理解何时、何地和如何在它们之间进行选择。
谢谢!
5个回答

5
  • Use var to keep your code short and more readable, or when working with anonymous types:

    var dict = new Dictionary<int, List<string>>();
    
    var x = db.Person.Select(p => new { p.Name, p.Age });
    
  • Use dynamic when dynamic binding is useful, or required. Or when you need to decide which method to call based on the runtime type of the object.

  • Use object as little as possible, prefer using specific types or generics. One place where it's useful is when you have object used just for locking:

    object m_lock = new object();
    
    lock (m_lock)
    {
        // do something
    }
    

那不是匿名类型的示例(除非“Name”本身就是一个匿名类型,但我认为它不可能是)。 - George Duckett
@George,是的,已经修复了。我不知道为什么会那样写。 - svick

3
var与完整类型的写法是完全相同的,因此当变量应该是单一类型时,请使用该方法。它通常与LINQ一起使用,因为您经常会在LINQ中使用匿名类型object是所有类的根,因此当一个变量将有许多不同、无关/未继承实例时,或者在编译时不知道类型时(例如反射),应该使用它。如果可能的话,应该避免使用它。 dynamic用于动态性质的对象,即它们可以具有不同的方法和属性,这对于与COM以及动态语言和特定领域的语言交互非常有用。

2

var:我用它来简化代码:

而不是写成:

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

我可以简单地表述:

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

1

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

dynamic非常类似于对象,但不像使用Object方法那样受限制,在这里Type在运行时推断出来,它将用于希望实现某些动态行为的情况。

对于object,它没有任何可用的成员,可以在这种情况下更倾向于使用泛型。


0

看看这个文章,它介绍了动态关键字的优点和限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接