int型初始值的区别是什么?
本文关键字:区别 是什么 int | 更新日期: 2023-09-27 18:18:51
我对这个线程有一些困惑
这些术语之间有什么区别?什么时候用什么?
int x = default(int);
int x = 0;
int x = new int();
我在中阅读了这个线程。
始终使用
int x = 0;
或者只是
int x;
它比其他版本更易于维护,可读性更好。而且,你的同行程序员提出的问题也会更少。
它们都是相同的,据我所知,它们都导致相同的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>();
您将得到一个包含一项的集合,即0。该方法以int
作为TSource
进行编译,因此它调用default (int)
,结果为0。如果您在一个空的字符串集合上调用相同的方法,该方法也将为string编译,并将使用default (string)
,这将导致null(因为这是所有引用类型的默认值)。
至于其他两个(new int()
和0
),我已经提到它们的意思是一样的,所以只使用较短的一个,零。它更容易阅读和维护,每个人都知道零是什么,所以构造函数可能只是令人困惑。
它们都是相同的,只是框架提供了不同的声明变量的方式。