新的“动态”C#4.0关键字是否弃用了'var'关键字?

时间:2008-11-18 09:43:41

标签: c# c#-4.0 dynamic-languages

当C#4.0发布时,我们有excellent presentation by Anders Hejlsberg中描述的动态关键字,(C#的发展速度超过了我能跟上的速度......我没有太多时间熟悉var关键字)

我还需要var关键字吗? var有什么可以做的......动态不能吗?

var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x

3 个答案:

答案 0 :(得分:72)

不,他们非常不同。

var表示“在编译时推断变量的类型” - 但它仍然完全静态绑定。

dynamic表示“假设我可以使用此变量执行任何操作” - 即编译器不知道可用的操作,并且DLR将确定调用真正在执行时意味着。

我希望很少使用dynamic - 只有当我真正想要动态行为时才会这样做:

  • var允许您在编译时捕获拼写错误等
  • 静态绑定代码总是比动态绑定代码运行得更快(即使差异变得相当小)
  • 静态绑定代码提供了更多的编译时支持,而不仅仅是错误:您可以找到调用层次结构,重构将更好地工作,Intellisense可用等等。

答案 1 :(得分:17)

Dynamic和var代表两种截然不同的想法。

<强> VAR

Var本质上要求编译器根据赋值语句右侧的表达式计算变量的类型。然后对该变量进行处理,就像将其显式声明为表达式的类型一样。例如,以下两个语句是等效的

var a = "foo";
string a = "foo";

这里带走的关键是“var”是100%类型安全的并且是编译时操作

<强>动态

动态在很多方面与var完全相反。使用dynamic基本上消除了特定变量的所有类型安全性。它有很多种方式没有类型。在变量上调用方法或字段时,将在运行时确定如何调用该字段。例如

dynamic d = SomeOperation();
d.Foo(); // Will this fail or not?  Won't know until you run the program

这里带走的关键是“动态”不是类型安全的并且是运行时操作

答案 2 :(得分:1)

是的,你仍然需要var:

Var 变量,其类型将由编译器推断。
动态将在运行时分配其类型

所以:

Var i = "Hello World"

将其类型推断为字符串类型,因此intellisence将为您提供字符串可以使用的所有方法,

i.Split("/")

其中:

dynamic i = "Hello World"

不会推断它的类型直到运行时因为编译器不知道它现在是什么类型,但仍然允许你这样做:

i.Split("/")

但是当它调用你需要的方法时,它可能会失败,因为类型错误而且方法不存在。