int i =0 和 int i = default(int) 之间有性能差异吗?(涉及IT技术)

5
我希望您能够创建一个整数,并在开始工作之前将其实例化为0。
我首先写的是:
int i = default(int);

然后我将其移除以用另一个替换,这个更好。

int i = 0;

我想知道我的选择在迷你迷你性能方面是否是最佳的。 default()函数会增加编译时的指令吗?


1
除了微观优化,还有纳米优化…… - H H
3个回答

13

不会,它们在编译时就已经解决了,并且生成相同的IL代码。值类型将为0(或false如果是布尔型,但仍然是0),引用类型则为null


总的来说,这是正确的吗?如果我有一个通用方法,比如 public T GetDefault<T>() { return default(T); } - 它在编译时无法解析。实际上,我可以使用它与尚不存在的类型一起使用。无论如何,真正的答案是 - 如果这个愚蠢的小改变对你有影响,那么 C# 对于你的需求可能太慢了。 - Kobi
2
这可以在编译时解决,因为 T 将会被知道/推断出来。 - George Duckett
1
@George - 那不是有趣的情况。如果您将GetDefault用作已编译程序集的一部分呢?在这种情况下,default(T)不会再次编译或优化(好吧,JIT会这样做,但那是另一个问题)。 - Kobi
1
@George 不是这样的。如果泛型方法是另一个项目引用的程序集中的公共方法,并且托管项目中的代码将其私有类型之一传递给泛型方法,那该怎么办?在构建程序集时无法知道将传递给该方法的内容。 - Adam Maras

4
马龙的回答在技术上是正确的,但每个选项之间应该有明显的语义差异。
int i = 0;

当你想在整数上进行数学运算并且该操作需要从变量具体值为零开始时,将其初始化为字面零是有语义意义的。一个很好的例子是创建索引计数器变量;你希望从零开始计数。

int i = default(int);

当你创建一个带有变量的类时,将其设置为默认值是有意义的,因为你知道这个变量将在后续过程中手动设置。以下是一个示例(尽管可能不实用):

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所说的完全相同。

这些小改变只会影响你实际的编程时间,因此从更广泛的意义上讲,写出default(int)比写0要慢,而你花费的思考时间更长。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接