新的“动态”C#4.0关键字是否会弃用“var”关键字?
当C#4.0出来时,我们有动态关键字,如Anders Hejlsberg在这个优秀的演示文稿中所描述的那样(C#的发展速度超过了我能跟上的速度……我没有太多时间熟悉var关键字)
我还需要var关键字吗? var有什么可以做的……动态不能吗?
var x = SomeFunctionThatIKnowReturnsSomeKindOfList(); // do something with x dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList(); // do something with x
不,他们非常不同。
var
表示“在编译时推断变量的类型” – 但它仍然完全静态绑定。
dynamic
意味着“假设我可以使用此变量执行任何操作” – 即编译器不知道可用的操作,并且DLR将确定调用在执行时的真正含义。
我希望很少使用dynamic
– 只有当我真正想要动态行为时:
-
var
允许你在编译时捕获拼写错误等 - 静态绑定代码总是比动态绑定代码运行得更快(即使差异变得相当小)
- 静态绑定代码提供了更多的编译时支持,而不仅仅是错误:您可以找到调用层次结构,重构将更好地工作,Intellisense可用等
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
这里带走的关键是“动态”不是类型安全的并且是运行时操作
是的你还需要var:
Var是一个变量,其类型将由编译器推断。
dynamic将在运行时分配其类型
所以:
Var i = "Hello World"
将其类型推断为字符串类型这样做intellisence将为您提供字符串可以使用的所有方法,如
i.Split("/")
如果:
dynamic i = "Hello World"
将不会推断它的类型直到运行时因为编译器不知道它是什么类型,但仍然会让你这样做:
i.Split("/")
但是当它调用你需要的方法时,它可能会失败,因为类型错误并且方法不存在。