在C#3.0+中使用'var'声明中的性能惩罚(如果有的话)

时间:2009-01-20 11:57:06

标签: .net c#-3.0

在c#3.0+中使用var声明是否有任何性能损失? Resharper一直在唠叨我自己使用它,我想知道它是否有任何缺点。

4 个答案:

答案 0 :(得分:11)

var关键字只告诉编译器从赋值中推断出类型,所以本质上没有运行时差异,所以不,没有性能上的惩罚。

是否有缺点,这是一个不同的故事。

答案 1 :(得分:3)

没有性能损失,因为类型推断是在编译时。但是,由于缺少明确的输入,它可能会使您的代码更难以遵循。

答案 2 :(得分:3)

不,没有。生成的IL代码完全相同。增益是更可读的源代码(在大多数情况下无论如何)。

另见this question

答案 3 :(得分:2)

没有任何惩罚。在有效编译之前,编译器将var替换为适当的确定编译时类型。为了更加可信,我甚至制作了一个小应用程序来演示这个使用前Lutz Roeder的反射器,现在是Red Gate的反射器:

版本1:

代码:

namespace ConsoleApplication28
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Person("Andrei Rinea");
            System.Console.WriteLine(p);
        }
    }

    class Person
    {
        private string _name;
        public Person(string name) { _name = name; }
        public override string ToString() { return _name; }
    }
}

生成CIL(CIL表示通用中介语言......有点像Java的字节码):

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] class ConsoleApplication28.Person p)
    L_0000: nop 
    L_0001: ldstr "Andrei Rinea"
    L_0006: newobj instance void ConsoleApplication28.Person::.ctor(string)
    L_000b: stloc.0 
    L_000c: ldloc.0 
    L_000d: call void [mscorlib]System.Console::WriteLine(object)
    L_0012: nop 
    L_0013: ret 
}

版本2(注意在代码片段的第7行用“Person”替换“Var”)

代码:

namespace ConsoleApplication28
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person("Andrei Rinea");
            System.Console.WriteLine(p);
        }
    }

    class Person
    {
        private string _name;
        public Person(string name) { _name = name; }
        public override string ToString() { return _name; }
    }
}

生成CIL

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] class ConsoleApplication28.Person p)
    L_0000: nop 
    L_0001: ldstr "Andrei Rinea"
    L_0006: newobj instance void ConsoleApplication28.Person::.ctor(string)
    L_000b: stloc.0 
    L_000c: ldloc.0 
    L_000d: call void [mscorlib]System.Console::WriteLine(object)
    L_0012: nop 
    L_0013: ret 
}

生成的CIL绝对没有区别!

所以这一切都很重要;)

编辑1:这是在调试模式下编译的...在发布时,nop的不会出现...;)