int型初始值的区别是什么?

本文关键字:区别 是什么 int | 更新日期: 2023-09-27 18:18:51

我对这个线程有一些困惑

这些术语之间有什么区别?什么时候用什么?

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

我在中阅读了这个线程

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 -当TSourcestring时,这将不起作用。如果你是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),我已经提到它们的意思是一样的,所以只使用较短的一个,零。它更容易阅读和维护,每个人都知道零是什么,所以构造函数可能只是令人困惑。

它们都是相同的,只是框架提供了不同的声明变量的方式。