声明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)
现在想象SomeValueType是Int32和DEFAULT是10.它就是!
您可能已经看到的Java,其中int和Integer是两个不同的东西,而后者需要你来写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)
您可能会想到,由于第二个赋值会覆盖第一个赋值,因此不需要第一个赋值.
在C#中有两种类型,"引用类型"和"值类型".(指针是第三种类型,但我们不能进入.)
当您使用值类型的默认构造函数时,您所说的只是"给我这个值类型的默认值".所以new int(),既不是说也不是说0.
所以你的程序是这样的:
int i = 0;
i = 10;
Run Code Online (Sandbox Code Playgroud)