为什么在c#中使用动态类型?

时间:2010-09-05 21:13:02

标签: c# .net .net-4.0 c#-4.0

起初我想的是:

var aName=getAllSomethings();

非常难以理解,所以我会在没有混淆的时候使用动态打字,例如:

AClassName aName = new AClassName();

下面,

var aName=new AClassName();

似乎可读。 但是,与我阅读(here)相比,动态打字还会带来性能代价 我尝试阅读该链接中的所有其他帖子,以了解我应该在哪里使用动态类型,但是甚至没有提出一个很好的理由。我应该等待,直到我告诉自己 - “这只能用动态打字来解决”?或者是否有更好(实际)的理由使用它?

感谢。

编辑:我的错误( - :将尽快关闭此问题。

6 个答案:

答案 0 :(得分:26)

var不是动态输入。只是编译器推断出aName的类型。

您的示例仍然是完全静态类型的,并且没有性能损失。您的代码被编译成与显式类型名称完全相同的IL。

现在在C#4中,动态类型确实存在,但它将被写为:

dynamic aName = new AClassName();

我个人认为,动态类型在C#4中相对很少有用 - 基本上当你处理的数据已经只是动态知道时,例如反射或导航XML。

答案 1 :(得分:6)

这不是动态输入。 var声明在编译时已知的静态类型,它绝对等同于声明类型名称。编译器将推断出类型并将其替换为生成的程序集。

答案 2 :(得分:5)

使用var关键字不是动态输入。 var关键字由编译器处理。变量根据对变量的第一次赋值进行静态类型化。

类型:

 var value = new StringBuilder();

是StringBuilder。没有办法改变那种类型(这是动态类型允许的)。

Jon Skeet在他的博客中指的是dynamic关键字。那是另一头野兽。

答案 3 :(得分:2)

这不是动态输入。动态类型是通过“动态”类型(奇怪的是)。使用var根本没有开销,它是一种编码速记,仍然会产生强类型变量。

答案 4 :(得分:2)

你是错误的,为什么动态打字是。

“var”使用Type Inference在编译时推导出变量的类型。它的机制相当直接,绝对没有性能影响。用“var”声明的变量仍然只能是一个精确类型(或该类型的派生)。

动态变量允许变量在运行时保存任何类型,并仍然对该对象执行操作,就像我们知道支持什么一样。这些调用中的每一个都使运行时执行检查以查看是否实际支持方法调用。这是动态类型具有运行时开销的部分原因。

答案 5 :(得分:2)

正如其他人提到的那样,'var'关键字不会给我们动态输入。该类型在编译时推断。

当我认为它有意义时,我使用var;也就是说,当类型明显时,它会减少声明的冗长:

var someDict = new Dictionary<string, int>();

而不是......

Dictionary<string, int>() someDict = new Dictionary<string, int>();

但是,在你的例子中:

var aName=getAllSomethings();

我不会使用'var',因为你已经注意到了,然后你必须检查'getAllSomethings()的返回类型(C#BTW的错误命名风格),以便知道'aName'是什么,这只会使代码的可读性降低。