为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

潇湘沐 2019-07-15 14:59:35

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

早些时候我问了一个问题为什么我看到这么多例子使用var关键词并且得到的答案是,虽然只对匿名类型有必要,但它还是用来使代码编写“更快”/更容易和“仅仅是因为”。

以下这个链接(“C#3.0-Var不是objec”)我看到了var在IL中编译到正确的类型(您将看到它大约在下一篇文章中)。

我的问题是,IL代码使用var关键字接受,如果代码在任何地方都被使用,那么它会不会接近于一个可测量的代码性能的水平?


查看完整描述

3 回答

?
暮色呼如

没有额外的IL代码var关键字:对于非匿名类型,产生的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变量。但是说它一点也不重要,这可能是夸大了它。


查看完整回答
反对 回复 2019-07-15
?
慕雪6442864

正如Joel所说,编译器的计算结果是编译时应该是什么类型的var,实际上这只是编译器保存击键的一个技巧,例如

var s = "hi";

被替换为

string s = "hi";

由编译器在产生任何IL之前。生成的IL将是一点儿没错就像你输入了字符串一样。


查看完整回答
反对 回复 2019-07-15
?
尚方宝剑之说

还没人提过反射器.。

如果您编译了以下C#代码:

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

然后在上面使用反光镜,你会得到:

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

因此,答案显然是没有运行时性能的影响!


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 190 浏览
我要回答

相关问题推荐

慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信