在c#3.0+中使用var声明是否有任何性能损失? Resharper一直在唠叨我自己使用它,我想知道它是否有任何缺点。
答案 0 :(得分:11)
var关键字只告诉编译器从赋值中推断出类型,所以本质上没有运行时差异,所以不,没有性能上的惩罚。
是否有缺点,这是一个不同的故事。
答案 1 :(得分:3)
没有性能损失,因为类型推断是在编译时。但是,由于缺少明确的输入,它可能会使您的代码更难以遵循。
答案 2 :(得分:3)
不,没有。生成的IL代码完全相同。增益是更可读的源代码(在大多数情况下无论如何)。
答案 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的不会出现...;)