2008-11-18 59 views
26

另外,在C#4.0出来,我们有动态关键字如本excellent presentation by Anders Hejlsberg描述,(C#是不断发展的速度比我能跟得上..我没有太多的时间来熟悉自己与var关键字)新的'动态'C#4.0关键字是否弃用'var'关键字?

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

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

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

也许不重要,但虽然var是关键字,但动态不是。这是一种类型。 – TimothyP 2008-11-18 16:58:59

+0

所以它'动态'基本上就像声明某种类型的“对象”,但编译器不会抱怨,当你调用它不存在的方法? – 2009-02-20 09:45:29

+1

是的,它会在运行时解决。如果存在,该方法将被称为..如果不是Boom! – Gishu 2009-02-20 11:06:37

回答

72

不,他们是非常不同的。

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

dynamic意思是“假设我可以做任何事情,我想这个变量” - 即编译器不知道哪些操作是可用的,并且DLR会制定出什么样的叫声真的意味着在执行时间。

我想到用dynamic很少 - 只有当我真正想要的动态行为:

  • var让你赶上在编译时错别字等
  • 静态绑定代码总是会跑的比动态快(即使差异变得相当小)
  • 静态绑定的代码给出了更多的编译时支持,而不仅仅是错误:你可以找到调用层次结构,重构会更好,Intellisense可用等
+0

这是我缺少的一块...... var是静态绑定的(因此带有编译时检查,工具等的好处) – Gishu 2008-11-18 10:09:02

17

Dynamic和var代表两个完全不同的想法。

变种

瓦尔基本上要求编译器找出变量的基础上的赋值语句的右手侧的表达式的类型。然后该变量就像它被显式声明为表达式的类型一样被处理。例如,下面的两个语句是等效

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

的关键,这里带走的是“无功”,是100%类型安全,是一个编译时操作

动态

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

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

在这里带走的关键是“动态”不是类型安全的,是一个运行时操作

1

是的,你仍然需要VAR:

瓦尔变量其类型将由编译器推断。
动态将有它的类型在运行时分配

所以:

Var i = "Hello World" 

都会有它的类型推断在这样一个字符串类型intellisence会给你所有的字符串可以用这样的方法,

i.Split("/") 

凡为:

dynamic i = "Hello World" 

不会有它的类型推断,直到运行时,因为编译器不到风度知道它是什么类型呢,但仍然让你做的事:

i.Split("/") 

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