之前我问了一个问题,为什么我看到这么多的例子使用var关键字,得到的答案是,虽然它只对匿名类型是必要的,但它仍然被用来使代码编写“更快”/更容易,并且“只是因为”。
通过这个链接(“c# 3.0 - Var不是对象”),我看到Var在IL中被编译为正确的类型(您将在文章的中间看到它)。
我的问题是,如果有的话,使用var关键字的IL代码会占用多少,如果它在任何地方都被使用,它是否会接近于具有可测量的代码性能水平?
之前我问了一个问题,为什么我看到这么多的例子使用var关键字,得到的答案是,虽然它只对匿名类型是必要的,但它仍然被用来使代码编写“更快”/更容易,并且“只是因为”。
通过这个链接(“c# 3.0 - Var不是对象”),我看到Var在IL中被编译为正确的类型(您将在文章的中间看到它)。
我的问题是,如果有的话,使用var关键字的IL代码会占用多少,如果它在任何地方都被使用,它是否会接近于具有可测量的代码性能水平?
当前回答
因此,明确地说,这是一种懒惰的编码风格。如果可以选择,我更喜欢原生类型;我将利用这一点额外的“噪音”来确保我在代码/调试时所编写和阅读的内容完全符合我的想法。耸肩*
其他回答
var关键字没有额外的中间语言(IL)代码:结果IL对于非匿名类型应该是相同的。如果编译器不能创建那个IL,因为它不能找出你想要使用的类型,你就会得到一个编译器错误。
唯一的技巧是,如果您手动设置类型,var将推断出您可能已经选择了一个Interface或父类型的确切类型。
使用var没有运行时性能成本。尽管如此,我怀疑编译器需要推断类型会有编译性能成本,尽管这很可能可以忽略不计。
以下方法:
private static void StringVsVarILOutput()
{
var string1 = new String(new char[9]);
string string2 = new String(new char[9]);
}
IL输出是这样的:
{
.method private hidebysig static void StringVsVarILOutput() cil managed
// Code size 28 (0x1c)
.maxstack 2
.locals init ([0] string string1,
[1] string string2)
IL_0000: nop
IL_0001: ldc.i4.s 9
IL_0003: newarr [mscorlib]System.Char
IL_0008: newobj instance void [mscorlib]System.String::.ctor(char[])
IL_000d: stloc.0
IL_000e: ldc.i4.s 9
IL_0010: newarr [mscorlib]System.Char
IL_0015: newobj instance void [mscorlib]System.String::.ctor(char[])
IL_001a: stloc.1
IL_001b: ret
} // end of method Program::StringVsVarILOutput
我总是在网络文章或指南写作中使用var这个词。
网络文章的文本编辑器宽度较小。
如果我这样写:
SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName coolClass = new SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName();
你会看到上面渲染的预代码文本太长,流出框,它被隐藏。读者需要向右滚动才能看到完整的语法。
这就是为什么我总是在网络文章写作中使用关键字var。
var coolClass = new SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName();
整个渲染的预代码正好适合屏幕。
在实践中,对于声明对象,我很少使用var,我依靠智能感知来更快地声明对象。
例子:
SomeCoolNamespace.SomeCoolObject coolObject = new SomeCoolNamespace.SomeCoolObject();
但是,对于从方法返回对象,我使用var来更快地编写代码。
例子:
var coolObject = GetCoolObject(param1, param2);
因为还没有人提到反射器…
如果你编译以下c#代码:
static void Main(string[] args)
{
var x = "hello";
string y = "hello again!";
Console.WriteLine(x);
Console.WriteLine(y);
}
然后使用反射器对它,你得到:
// Methods
private static void Main(string[] args)
{
string x = "hello";
string y = "hello again!";
Console.WriteLine(x);
Console.WriteLine(y);
}
所以答案显然是没有运行时性能的影响!