在C#中,为什么在声明int时不使用'new'关键字?

use*_*912 4 c# int

声明int时..

int A = 10;
Run Code Online (Sandbox Code Playgroud)

为什么不做以下呢?

int A = new Int()
A=10;
Run Code Online (Sandbox Code Playgroud)

两者都一样吗?

Mik*_*scu 10

因为int语法糖Int32是值类型.顺便提一下,常量值10(值类型 Int32的实例)也是如此.这就是为什么你不需要new用来创建一个新实例,而是制作一个副本10并调用它A.类似的语法也适用于引用类型,但区别在于没有复制; 创建了一个引用.

从本质上讲,您可以将其10视为先前声明的实例Int32.然后int A = 10只是将变量A设置为值的副本10(如果我们正在讨论引用类型,那么A将被设置为对实例的引用而不是副本).

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

struct SomeValueType {
    public SomeValueType(){        
    }
}

public static readonly SomeValueType DEFAULT = new SomeValueType();
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

SomeValueType myValueType = DEFAULT;  // no neeed to use new!    
Run Code Online (Sandbox Code Playgroud)

现在想象SomeValueTypeInt32DEFAULT10.它就是!


Dan*_*ker 7

您可能已经看到的Java,其中intInteger是两个不同的东西,而后者需要你来写new Integer(10).

在C#中int是一个特殊的别名Int32,并且出于所有意图和目的,它们是相同的.实际上,要创建任何类型的新实例,您必须编写new Int32()或其他东西.

但是,因为整数是C#(和大多数编程语言)中的原始类型,所以整数文字有一种特殊的语法.只是写作10使它成为Int32(或int).

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

int a = new Int32();  // First assignment, a equals 0
a = 10;               // Second assignment, a equals 10
Run Code Online (Sandbox Code Playgroud)

您可能会想到,由于第二个赋值会覆盖第一个赋值,因此不需要第一个赋值.


Eri*_*ert 7

在C#中有两种类型,"引用类型"和"值类型".(指针是第三种类型,但我们不能进入.)

当您使用值类型的默认构造函数时,您所说的只是"给我这个值类型的默认值".所以new int(),既不是说也不是说0.

所以你的程序是这样的:

int i = 0;
i = 10;
Run Code Online (Sandbox Code Playgroud)

  • 为什么 C# 设计者没有为其定义一个额外的 ctor,以便我们可以调用 `int i=new int(10);` 而不必先设置为 0? (2认同)