一尘不染

使用“ var”会影响性能吗?

c#

早些时候,我问了一个问题,为什么我看到这么多的示例使用该var关键字并得到答案,尽管仅对于匿名类型是必需的,但仍使用它来使代码“更快捷” /更容易和“仅因为”而编写。

通过此链接(“ C#3.0-Var Is’t Objec”),我看到它已var被编译为IL中正确的类型(您将在文章中途看到它)。

我的问题是,使用var关键字take可以获取多少IL代码(如果有的话),如果到处使用它,它的性能甚至可以接近一个可衡量的水平吗?


阅读 289

收藏
2020-05-19

共1个答案

一尘不染

var关键字没有额外的IL代码:对于非匿名类型,生成的IL应该相同。如果编译器由于无法弄清您打算使用哪种类型而无法创建该IL,则会出现编译器错误。

唯一的技巧是,var如果您要手动设置类型,则将推断出您可能已选择接口或父类型的确切类型。


8年后更新

由于我的理解发生了变化,我需要对此进行更新。我现在认为,var在方法返回接口的情况下,可能会影响性能,但是您应该使用确切的类型。例如,如果您具有以下方法:

IList<int> Foo()
{
    return Enumerable.Range(0,10).ToList();
}

考虑以下三行代码来调用该方法:

List<int> bar1 = Foo();
IList<int> bar = Foo();
var bar3 = Foo();

所有这三个编译并按预期执行。但是,前两行 并不
完全相同,第三行将匹配第二行,而不是第一行。因为的签名Foo()是返回IList<int>,所以编译器将如何构建bar3变量。

从性能的角度来看,大多数情况下您不会注意到。但是,在某些情况下,第三行的性能可能不如第一行的性能快。当您继续使用bar3变量时,编译器可能无法以相同的方式分派方法调用。

请注意,抖动有可能(可能甚至)消除这种差异,但不能保证。
通常,var就性能而言,您仍应考虑成为非关键因素。当然,它根本不像使用dynamic变量。但是要说它根本没有改变可能是夸大了它。

2020-05-19