【问题标题】:int num = new int(); What happens when this line executes?int num = 新的 int();当这条线执行时会发生什么?
【发布时间】:2013-06-17 12:32:01
【问题描述】:

今天认识了一个新东西,我们可以使用new 操作符来创建整数,如下所示

int num = new int();

现在我想知道如果我以这种方式创建一个整数,那么生成的整数将是值类型还是引用类型?我想这将是一个值类型。我试过下面的代码

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

我收到以下构建错误:

使用未赋值的局部变量“num3”

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

感谢和问候:)

【问题讨论】:

  • int i = new int()int i = 0 产生完全相同的 IL,因此仅从编译器的角度来看没有区别。字面符号似乎更友好,所以我建议坚持使用它,不要为显式调用 int 构造函数而烦恼。
  • default(int) 也与new int()0 相同(在此上下文中)。据我了解,结构的默认构造函数(new T()default(T))只是构成结构的字节中的所有零。使用int,表示0
  • 更高级的东西,见stackoverflow.com/questions/9207488/…

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


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    答案在 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 类型的文字

    【讨论】:

      【解决方案3】:

      我想,你正在寻找

      int num = default(int);
      

      这在遇到编译错误时也很有用,未分配的局部变量

      【讨论】:

      • int num = default(int); - 维护团队的困惑。
      • default(int) 很傻。 default 关键字仅在处理泛型类型时才有用:default(T)
      • @IlyaIvanov:你是什么意思?
      • @IlyaIvanov 我喜欢使用default(int)。它为您提供一致的样式(带有类)并使您的意图清晰。如果我想为我的变量设置 0,我分配一个零。如果我只想要一个最初我不关心的赋值,我使用default(int)
      • @nawfal default(int) 有什么意义?为什么不节省您和同行的时间,只写0?写default(int) 时添加的语义是什么?这是否表明您不在乎价值?为什么不将创建提取到单独的方法中并给它一个有意义的名称,例如CreateNumberIDontCareOfExtractNumberFromTheDeepEdgesOfBurningHell?如果您将域默认值从零更改为一,您是否还应该将所有调用更改为default(int),这从定义上来说比将0 更改为1 在一个位置甚至多个位置更困难。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多