之前我问了一个问题,为什么我看到这么多的例子使用var关键字,得到的答案是,虽然它只对匿名类型是必要的,但它仍然被用来使代码编写“更快”/更容易,并且“只是因为”。

通过这个链接(“c# 3.0 - Var不是对象”),我看到Var在IL中被编译为正确的类型(您将在文章的中间看到它)。

我的问题是,如果有的话,使用var关键字的IL代码会占用多少,如果它在任何地方都被使用,它是否会接近于具有可测量的代码性能水平?


当前回答

如果编译器可以自动进行类型推断,那么就不会有任何性能问题。这两种方法都会生成相同的代码

var    x = new ClassA();
ClassA x = new ClassA();

然而,如果你是动态构造类型(LINQ…),那么var是你唯一的问题,还有其他的机制来比较,以说明什么是惩罚。

其他回答

因此,明确地说,这是一种懒惰的编码风格。如果可以选择,我更喜欢原生类型;我将利用这一点额外的“噪音”来确保我在代码/调试时所编写和阅读的内容完全符合我的想法。耸肩*

var关键字没有额外的中间语言(IL)代码:结果IL对于非匿名类型应该是相同的。如果编译器不能创建那个IL,因为它不能找出你想要使用的类型,你就会得到一个编译器错误。

唯一的技巧是,如果您手动设置类型,var将推断出您可能已经选择了一个Interface或父类型的确切类型。

c#编译器在编译时推断var变量的真实类型。产生的IL没有差异。

因为还没有人提到反射器…

如果你编译以下c#代码:

static void Main(string[] args)
{
    var x = "hello";
    string y = "hello again!";
    Console.WriteLine(x);
    Console.WriteLine(y);
}

然后使用反射器对它,你得到:

// Methods
private static void Main(string[] args)
{
    string x = "hello";
    string y = "hello again!";
    Console.WriteLine(x);
    Console.WriteLine(y);
}

所以答案显然是没有运行时性能的影响!

就像Joel说的,编译器在编译时计算出var应该是什么类型,实际上这只是编译器用来节省击键的一个技巧,举个例子

var s = "hi";

被替换为

string s = "hi";

在生成任何IL之前,编译器会调用。生成的IL将完全相同,如果你键入字符串。