【问题标题】:in C#, why not use 'new' keyword when declaring an int?在 C# 中,为什么在声明 int 时不使用“new”关键字?
【发布时间】:2013-03-11 17:08:59
【问题描述】:

当声明一个 int..

int A = 10;

为什么不做以下呢?

int A = new Int()
A=10;

都一样吗?

【问题讨论】:

标签: c# int


【解决方案1】:

因为intInt32 的语法糖,它是一个值类型。顺便说一句,常数值10value typeInt32 的一个实例)也是如此。这就是为什么您不需要使用new 来创建新实例,而是复制10 并将其命名为A。类似的语法也适用于引用类型,但不同之处在于不复制;创建了一个引用。

基本上,您可以将10 视为先前声明的Int32 实例。然后int A = 10 只是将变量A 设置为值10副本(如果我们谈论的是reference types,那么A 将被设置为对实例的引用而不是副本)。

为了更好地说明这里是另一个例子:

struct SomeValueType {
    public SomeValueType(){        
    }
}

public static readonly SomeValueType DEFAULT = new SomeValueType();

那么你可以这样做:

SomeValueType myValueType = DEFAULT;  // no neeed to use new!    

现在假设SomeValueTypeInt32 并且DEFAULT10。来了!

【讨论】:

  • System.Int32 不是整数 :)
  • @DaveShaw - 是的.. 我的错 :)
  • 这不是装箱吗?在 Java 中,Long 是一个对象,long 是一个原语。
  • @svick - 这正是我所说的:_ 将 10 视为先前声明的 Int32 实例_
  • @svick - 嗯.. 我已经重读了一遍,我知道这可能会被错误地解释。我会编辑。
【解决方案2】:

你可能见过Java,其中intInteger是两个不同的东西,后者需要你写new Integer(10)

在 C# 中,intInt32 的特殊别名,在所有意图和目的上它们都是相同的。实际上,要创建任何类型的新实例,您必须编写 new Int32() 或其他内容。

但是,由于整数是 C#(和大多数编程语言)中的基本类型,因此整数文字有一种特殊的语法。只需编写 10 即可使其成为 Int32(或 int)。

在您的示例中,您实际上为 a 变量赋值了两次:

int a = new Int32();  // First assignment, a equals 0
a = 10;               // Second assignment, a equals 10

你可能会想,由于第二个赋值覆盖了第一个,所以第一个赋值不是必需的。

【讨论】:

    【解决方案3】:

    在 C# 中有两种类型,“引用类型”和“值类型”。 (指针是第三种类型,但我们先不谈。)

    当您使用值类型的默认构造函数时,您所说的只是“给我这个值类型的默认值”。所以new int() 不仅仅是说0

    所以你的程序是一样的:

    int i = 0;
    i = 10;
    

    【讨论】:

    • 为什么 C# 设计者没有为它定义一个额外的 ctor 以便我们可以调用 int i=new int(10); 而不必先设置为 0?
    【解决方案4】:

    如果你写你的代码像

    int A = new Int();
    

    变量'A'由int的默认值赋值,所以你可以使用变量'A'而不给它赋值(在c#中,我们不能在没有赋值的情况下使用变量) 当使用关键字new时,它会自动调用默认构造函数,它会为变量分配默认值。

    【讨论】:

      【解决方案5】:
      int A = new Int();
      

      它将A声明并初始化为0

      基本上,这里的 new 运算符用于调用值类型的默认构造函数。对于 int 类型,默认值为 0。

      和下面的效果一样:

      int A = 0;
      

      【讨论】:

      • 欢迎来到 StackOverflow!下次请看降价:)
      • 基本上这里的new操作符是用来调用值类型的默认构造函数的。对于 int 类型,默认值为 0。
      • Int 不是有效的 .NET 类型。使用 new Int32() 或 new int()
      猜你喜欢
      • 2023-03-06
      • 2016-08-12
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多