C#中的var关键字是否导致拳击?

msf*_*boy 38 c# performance boxing var

我的老板禁止我使用,var因为它会导致拳击和减慢应用程序.

真的吗?

Aak*_*shM 52

可能有效的方法是编写这两种方法:

public static void WithInt()
{
    int x = 5;
    Console.WriteLine(x);
}

public static void WithVar()
{
    var x = 5;
    Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)

编译,并用于ildasm检查生成的CIL.告诉你的老板.

编辑 @ck为你完成了最后一步 :)

  • 哈,或者如何将鼠标悬停在`x`(在Visual Studio中)并向老板显示它说"int"? (8认同)
  • +1能够向他的老板证明他是错的 (5认同)
  • 我建议在"面对面"时提出一些敏感性!证据给你的老板 - 他可能真的把这个问题与其他事情搞混了,并证明他的错误不会赢得他的支持IMO. (3认同)

cjk*_*cjk 37

接下来是Aakash的回答,这是IL :(谢谢LINQPad)

WithInt:
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  call        System.Console.WriteLine
IL_0008:  ret         

WithVar:
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  call        System.Console.WriteLine
IL_0008:  ret      
Run Code Online (Sandbox Code Playgroud)

  • 等等......我看到的是什么区别?哦,没关系,这只是我监视器上的一个地方:) (10认同)

Dan*_*ker 32

为什么这么多人被愚蠢的老板诅咒?革命,兄弟们!

你的老板需要阅读文档.var使编译器通过查看初始化表达式的静态类型来找出变量类型.无论您是手动指定类型还是使用它var并让编译器为您解决,它在运行时都没有丝毫差异.

更新在问题的评论中,汉斯帕斯特问道

你能想到任何导致拳击而不使用演员阵容的var初始化器吗?

强制执行此类转换的自包含表达式的示例是:

var boxedInt = new Func<int, object>(n => n)(5);
Run Code Online (Sandbox Code Playgroud)

但这与以下内容完全相同:

object boxedInt = new Func<int, object>(n => n)(5);
Run Code Online (Sandbox Code Playgroud)

换句话说,这实际上并没有任何关系var.我的初始化表达式的结果是object,因此var必须使用它作为变量的类型.它不可能是其他任何东西.

  • 比彼得原则更简单的是递归证明:如果你的老板比你愚蠢,他为什么被雇用?好吧,他的老板比他愚蠢.等等. (3认同)
  • @annakata:它被称为"彼得原则":http://en.wikipedia.org/wiki/Peter_Principle (2认同)

Bri*_*sen 32

这根本不是真的.

var只是意味着"亲爱的编译器,我知道这种类型是什么,你也是,所以让我们继续吧."

它使代码更短,有些人发现它更具可读性(其他人发现它更不易读),但是没有任何性能损失.

  • @annakata:不,这并不意味着"我不在乎类型是什么" - 它意味着"我希望类型是= =右侧表达式的类型".没有猜测.编译器无权随意选择类型.该规范非常清楚地阐述了它. (9认同)
  • "亲爱的编译器..."很好:)但是程序问题我认为这意味着"亲爱的编译器我不在乎类型是什么,你决定" (8认同)
  • @annakata:"你决定"也没关系,只要"让我惊喜!" 是不可能的:) (6认同)
  • @Jon:也许我说的太轻了.我不是建议编译器猜测或者这里存在任何不确定性,我试图表达var允许我不关心LHS的类型,除了RHS给我的内容,*无论如何是*.价值在与我脱钩. (2认同)

Dar*_*mas 10

也许你的老板是一个旧的Visual Basic(在<= 6.0中)程序员习惯了这种VARIANT类型.如果你没有在DIM语句中明确指定变量VARIANT的类型,union那么如果我没记错的话,它就是一种类型.将这些变量传递给函数时,您可以将其视为一种"装箱"和"拆箱".

有时人们会感到困惑.向你的老板询问他的Visual Basic战争故事.聆听,学习并同时获得一些同情!当您离开办公室时,您可以指出c#编译器在编译时将这些东西计算出来并且"装箱"不再是问题.

不要指望你的老板必须跟上语言/ API的最新变化.这不是愚蠢的.这是关于还有其他事情要做.比如他的工作.

编辑:如下面的评论中所述,但是,告诉你不要var因为错误的原因而使用可能不是他的工作......

  • +1用于解释老板的行为.听起来很可能.但如果老板认为他的知识在没有他跟上的情况下保持相关性,那么他至少有点愚蠢.如果他花时间告诉程序员使用哪些关键词(虽然他们比他知道的要好),那么他也没有做好自己的工作. (4认同)