新的“dynamic”C# 4.0 关键字是否弃用了“var”关键字?
-
08-07-2019 - |
题
当 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
让你在编译时捕获拼写错误等- 静态绑定代码总是比动态绑定代码运行得更快(即使差异变得相当小)
- 静态绑定代码提供了更多编译时支持,而不仅仅是错误:你可以找到调用层次结构,重构会更好,智能感知可用等
其他提示
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
这里带走的关键是<!> quot; dynamic <!> quot;不是类型安全的并且是运行时操作
是的,你仍然需要var:
Var 是变量,其类型将由编译器推断。 点击 动态将在运行时分配其类型
所以:
Var i = "Hello World"
将其类型推断为字符串类型,因此intellisence将为您提供字符串可以使用的所有方法,
i.Split("/")
其中:
dynamic i = "Hello World"
不会推断它的类型直到运行时因为编译器不知道它现在是什么类型,但仍然会让你这样做:
<*>但是当它调用你需要的方法时,它可能会失败,因为类型错误而且方法不存在。