4

我正在学习 C# 和 .NET,我经常var在代码中使用关键字。我从 Eric Lippert 那里得到了这个想法,我喜欢它如何提高我的代码的可维护性。

我想知道,虽然......在博客中已经写了很多关于慢速堆定位的引用,但我自己并没有观察到这一点。这真的很慢吗?我指的是由于类型推断导致的编译时间缓慢。

4

5 回答 5

20

你说:

我指的是由于类型“推理”而导致编译时间缓慢

这不会减慢编译器的速度。编译器已经必须知道表达式的结果类型,以便检查赋值的兼容性(直接或间接)。在某些方面,使用这种已知类型会消除一些事情(例如,必须检查继承、接口和转换运算符的可能性)。

它也不会减慢运行时间;它们是完全静态编译的,就像常规的 c# 变量(它们是)一样。

简而言之......它没有

于 2011-05-13T18:35:41.450 回答
14

C# 中的 'var' 不像您在 VB 中习惯的那样是 VARIANT。var 只是编译器让您用来简写类型的语法糖。编译器计算出表达式右侧的类型并将变量设置为该类型。它根本没有性能影响 - 就像您键入完整的类型表达式一样:

var x = new X();

完全一样

X x = new X();

这似乎是一个微不足道的例子,而且确实如此。当表达式更复杂甚至“不可表达”(如匿名类型)和可枚举时,这真的很重要。

于 2011-05-13T17:59:11.507 回答
7

Var 在编译时被您的实际变量类型替换。你在想dynamic吗?

于 2011-05-13T17:58:54.787 回答
2

“变体”是无类型的,因此访问状态(或内部状态转换)始终必须经过两个步骤:(1)确定“真实”内部类型,以及(2)从“真实”内部类型中提取相关状态.

当您从一个类型化的对象开始时,您没有这个两步过程。

诚然,“变体”因此具有这种额外的开销。适当的用途是在您希望任何类型的便利以简化代码的情况下,例如使用大多数脚本语言或非常高级的 API。在这些情况下,“变体”开销通常并不重要(因为无论如何您都在使用高级 API)。

但是,如果您在谈论“ var”,那么这只是您说“编译器,将正确的类型放在这里”的一种方便方式,因为您不想做那项工作,并且编译器应该能够想办法。在这种情况下,“ var”不代表(运行时)“变体”,而只是源代码规范语法。

于 2011-05-13T18:00:06.923 回答
2

编译器从构造函数推断类型。

var myString = "123";string myString = "123";

此外,一般来说,引用类型存在于堆上,而值类型存在于堆栈上,无论它们是否使用 var 声明。

于 2011-05-13T18:00:27.017 回答