1

我对这个线程有些困惑。

这些术语之间有什么区别?我什么时候应该使用什么?

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

我在这个线程中读到这里。

4

3 回答 3

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?
    }
}

您希望它适用于所有类型,但是如何获得任何类型的实例?你不知道它是否是 and int,所以你可以写- 当isyield return 0时那行不通。如果你,那将不适用于......此外,某些类型可能没有无参数构造函数,有些可能根本没有可访问的构造函数(一个奇怪的情况,但可能会发生,例如包含一些单例实例的集合)或也许您有一个接口/抽象类类型的集合,并且您无法构造它们的实例(如果您不知道实现/继承它们的另一种类型)。TSourcestringyield return nullint

default是否适合这些情况。您不知道TSource可能是什么类型,但default (TSource)无论如何都会给您默认值。

如果你打电话

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

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

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

于 2013-06-17T19:52:13.077 回答
1

始终使用

int x = 0;

甚至只是

int x;

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

于 2013-06-17T20:23:01.907 回答
0

它们都是相同的,只是该框架提供了不同的方式来声明变量。你可以选择任何你觉得容易使用的。

于 2013-06-17T20:14:20.687 回答