int初始化值有什么区别?

时间:2013-06-17 19:47:41

标签: c#

我对this thread抱有一些疑惑。

这些条款有何不同?我什么时候应该使用什么?

int x = default(int);
int x = 0;
int x = new int(); 

我在 this thread 中阅读了这里。

3 个答案:

答案 0 :(得分:1)

它们都是一样的,据我所知,它们都会产生相同的IL:

ldc.i4.0

default是泛型的便捷关键字。即使不知道其类型,也可以将变量初始化为其默认值。那么对于引用类型它将为null,对于int为0,对于其他结构则为相应的默认值。

构造函数new int()在那里因为int只是一个(值)类型,所以它有一个构造函数,你可以调用它。

语义上new int()0是相同的,default有点不同,但是如果是整数,它会产生相同的代码。

代码示例(我认为值得一个例子的唯一事情是default关键字):

假设您有一个 DefaultIfEmpty 方法的简单实现(代码取自 edulinq 并略有修改 - 它是一个很棒的存储库如果你对LINQ感兴趣!)。此方法要么生成源集合的项目,要么只生成一个项目,这是指定泛型类型的默认值:

public static IEnumerable<TSource> DefaultIfEmpty<TSource>(
        IEnumerable<TSource> source)
{
    bool foundAny = false;
    foreach (TSource item in source)
    {
        yield return item;
        foundAny = true;
    }
    if (!foundAny)
    {
        yield return // What to return here?
    }
}

您希望这适用于所有类型,但是如何获得任何类型的实例? 你不知道是不是int,所以你可以写yield return 0 - 这在TSourcestring时无效。如果您yield return null,则不适用于int ... 还有一些类型可能没有无参数构造函数,有些可能根本没有可访问的构造函数(一个奇怪的情况,但可能发生,例如包含一些单例实例的集合)或者你可能有一个接口/抽象类类型的集合,你不能构造他们的实例(如果你不知道实现/继承它们的另一种类型)。

default完全适合这些情况。您不知道TSource的类型,但default (TSource)无论如何都会为您提供默认值。

如果你打电话

var collectionWithZero = new int[0].DefaultIfEmpty<int>();

你将获得一个项目的集合,零。该方法使用int编译为TSource,因此它调用default (int)并导致0.如果在空字符串集合上调用相同的方法,则该方法将为也为字符串编译并使用default (string),结果为null(因为这是所有引用类型的默认值)。

至于其他两个(new int()0),我已经提到它们的意思相同,所以只需使用较短的一个,零。它更容易阅读和维护,每个人都知道零是什么,所以构造函数可能只会令人困惑。

答案 1 :(得分:1)

始终使用

int x = 0;

甚至只是

int x;

它比其他版本更易于维护,更易读。此外,很可能会减少您的同行程序员的问题。

答案 2 :(得分:0)

它们都是相同的,只是框架提供了不同的方式来声明变量。您可以选择哪种方式易于使用。