我对this thread抱有一些疑惑。
这些条款有何不同?我什么时候应该使用什么?
int x = default(int);
int x = 0;
int x = new int();
我在 this thread 中阅读了这里。
答案 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
- 这在TSource
为string
时无效。如果您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)
它们都是相同的,只是框架提供了不同的方式来声明变量。您可以选择哪种方式易于使用。