27

当 C# 4.0 出现时,我们有了Anders Hejlsberg 的精彩演讲中所描述的 dynamic 关键字,(C# 的发展速度比我跟上的要快。我没有太多时间来熟悉 var 关键字)

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

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

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

3 回答 3

72

不,它们非常不同。

var意思是“在编译时推断变量的类型”——但它仍然完全是静态绑定的。

dynamic意思是“假设我可以用这个变量做任何我想做的事”——即编译器不知道有哪些操作可用,DLR 将在执行时计算出调用的真正含义。

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

  • var让您在编译时捕获拼写错误等
  • 静态绑定的代码总是比动态绑定的代码运行得更快(即使差异变得相当小)
  • 静态绑定代码提供了更多的编译时支持,而不仅仅是错误:您可以找到调用层次结构,重构会更好,Intellisense 可用等
于 2008-11-18T09:52:13.557 回答
17

dynamic 和 var 代表了两种完全不同的想法。

变量

Var 本质上是要求编译器根据赋值语句右侧的表达式来确定变量的类型。然后该变量被完全视为就好像它被显式声明为表达式的类型一样。例如以下两个语句是等价的

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

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

动态的

动态在许多方面与 var 完全相反。使用动态本质上消除了特定变量的所有类型安全性。它在很多方面都没有类型。当您调用变量上的方法或字段时,如何调用该字段的决定发生在运行时。例如

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

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

于 2008-11-18T09:53:33.993 回答
1

是的,你仍然需要 var:

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

所以:

Var i = "Hello World"

这样做会将其类型推断为字符串类型,因此智能将为您提供字符串可以使用的所有方法,例如,

i.Split("/")

然而:

dynamic i = "Hello World"

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

i.Split("/")

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

于 2008-11-18T09:55:14.707 回答