我对这个线程有些困惑。
这些术语之间有什么区别?我什么时候应该使用什么?
int x = default(int);
int x = 0;
int x = new int();
我在这个线程中读到这里。
它们都是相同的,据我所知,它们都产生相同的 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
时那行不通。如果你,那将不适用于......此外,某些类型可能没有无参数构造函数,有些可能根本没有可访问的构造函数(一个奇怪的情况,但可能会发生,例如包含一些单例实例的集合)或也许您有一个接口/抽象类类型的集合,并且您无法构造它们的实例(如果您不知道实现/继承它们的另一种类型)。TSource
string
yield return null
int
default
是否适合这些情况。您不知道TSource
可能是什么类型,但default (TSource)
无论如何都会给您默认值。
如果你打电话
var collectionWithZero = new int[0].DefaultIfEmpty<int>();
你会得到一个包含一个项目的集合,一个零。该方法使用int
as编译TSource
,因此它调用default (int)
并且结果为 0。如果您在一个空的字符串集合上调用相同的方法,该方法也将被编译为 string 并将使用default (string)
,这将导致 null (因为这是所有引用类型的默认值)。
至于其他两个 (new int()
和0
),我已经提到它们的含义相同,所以只需使用较短的一个,即零。它更易于阅读和维护,每个人都知道零是什么,因此构造函数可能只会令人困惑。
始终使用
int x = 0;
甚至只是
int x;
它比其他版本更易于维护,可读性更好。此外,您的同行程序员的问题很可能会发生较少。
它们都是相同的,只是该框架提供了不同的方式来声明变量。你可以选择任何你觉得容易使用的。