2011-07-13 71 views
3

我正在创建一个整数,我想在处理之前用0来实例化它。int i = 0和int i = default(int)之间是否存在性能差异?

我写首先

int i = default(int); 

然后我删除它与另一种是

int i = 0; 

我想知道我的选择是在小型微型表现最好更换。 在编译时default()函数是否会增加指令?

+2

所以'诠释我'应该表现更好?我相信这样的问题甚至不值得提问;这对我来说听起来像是对语言编译器的侮辱 – driushkin

+1

并且超越微优化总是存在纳米优化... –

回答

9

不,它们在编译时解析并产生相同的IL。值类型将为0(或false,如果您有bool,但仍为0),并且引用类型为null

+0

这是正确的吗?如果我有一个通用的方法,如'public T GetDefault (){return default(T); }' - 编译时无法解析。事实上,我可以将它用于尚不存在的类型。无论如何,真正的答案是 - 如果这个愚蠢的小改变对你有所帮助,C#可能无法满足你的需求。 – Kobi

+2

这可以在编译时解决,因为'T'将被知道/推断。 –

+1

@George - 这不是一个有趣的案例。如果你使用'GetDefault'作为编译程序集的一部分呢?在这种情况下,'default(T)'不会再次编译或优化(OK,它是通过JIT,但这是另一个问题) – Kobi

3

马龙的答案在技术上是正确的,但每个选项之间应该有明确的语义差异。

int i = 0; 

初始化字面零使得语义感觉,当你想要做的整数数学运算,并将该操作需要开始与变量是零的特定值。一个很好的例子是创建一个索引计数器变量;你想从零开始计数。

int i = default(int); 

一个变量设置为它的default价值是有道理的,当你,例如,创建一个类与所述变量,你知道的变量将在这个过程中手动设置以后。下面是一个例子(但不实用的可能):

class IntegerClass 
{ 
    private int value; 

    public IntegerClass(int value) 
    { 
     this.value = value; 
    } 

    public void Reset() 
    { 
     this.value = default(int); 
    } 
} 

同样,他们在技术上相等(并且实际上将编译到相同CIL),但每种方法提供不同的语义。

此外,在使用泛型时,可能需要使用default来初始化变量。

public T SomeOperation<T>() 
{ 
    T value = default(T); 

    this.SomeOtherOperation(ref value); 

    return T; 
} 
1

唯一真正的区别在于它将使就是编译时间,所以我想,当你按下调试它会比其他毫毫毫毫秒快的一种方式或编译,但作为编译完成后,它与Marlon所说的完全一样

这些小的改动只会影响你的实际编程时间,所以在更广泛的意义上,写出默认值(int)比写入0要慢,你花费更多的时间思考它。

相关问题