int num = new int();这条线执行时会发生什么?

时间:2013-06-17 12:32:01

标签: c# .net new-operator instantiation value-type

今天了解我们可以使用new运算符创建整数,如下所示

int num = new int();

现在我想知道我是否以这种方式创建一个整数,然后生成的整数将是一个值类型或引用类型?我想这将是一种价值类型。我尝试了下面的代码

int num1 = 10;
int num2 = new int();
int num3;
num1 = num2;
num2 = num3;

我收到了以下构建错误:

  

使用未分配的本地变量'num3'

我知道为什么会出现这个构建错误。但我想知道何时以及如何使用new int()以及这究竟是如何工作的?有人可以对此有所了解吗?

谢谢&问候:)

3 个答案:

答案 0 :(得分:5)

int i = new int();

等于

int i = 0;

它们之间没有区别。它们将生成相同的 IL 代码。

  // Code size       4 (0x4)
  .maxstack  1
  .locals init ([0] int32 num)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.0
  IL_0003:  ret

来自Using Constructors (C# Programming Guide)

  

结构类型的构造函数类似于类构造函数,但类似于结构体   不能包含显式默认构造函数,因为提供了一个   由编译器自动完成。此构造函数初始化每个字段   在结构中默认值

整数的默认值为0。检查更多Default Values Table

答案 1 :(得分:3)

答案在C#语言规范的 4.1.2 部分:

  

所有值类型都隐式声明一个名为默认构造函数的公共无参数实例构造函数。默认构造函数返回零初始化实例,称为值类型的默认值:

     

与任何其他实例构造函数一样,使用new运算符调用值类型的默认构造函数。出于效率原因,此要求并非旨在实际生成构造函数调用。在下面的示例中,变量i和j都初始化为零。

class A
{
    void F() {
        int i = 0;
        int j = new int();
    }
}

在不使用默认构造函数的情况下执行操作,例如

int x = 1;

C#语言规范的 4.1.4 部分涵盖了这一点:

  

大多数简单类型允许通过编写文字来创建值(第2.4.4节)。例如,123是int

类型的文字

答案 2 :(得分:1)

我想,你正在寻找

int num = default(int);

当面对编译错误未分配的局部变量

时,这也很有用