C# 在C语言中,为什么不使用';新';声明int时的关键字?

C# 在C语言中,为什么不使用';新';声明int时的关键字?,c#,int,C#,Int,当声明一个int int A = 10; 为什么不改为做下面的事情呢 int A = new Int() A=10; 两者都是相同的吗?因为语法是一种值类型。顺便提一下,常量值10(的一个实例)也是如此。这就是为什么您不需要使用创建新实例,而是制作10的副本并将其称为a。类似的语法也适用于引用类型,但不同的是没有复制;将创建一个引用 本质上,您可以将10视为以前声明的实例。然后inta=10只是将变量A设置为值10的副本(如果我们正在讨论,那么A将被设置为对实例的引用,而不是副本) 为了更好

当声明一个int

int A = 10;
为什么不改为做下面的事情呢

int A = new Int()
A=10;
两者都是相同的吗?

因为语法是一种值类型。顺便提一下,常量值
10
(的一个实例)也是如此。这就是为什么您不需要使用创建新实例,而是制作
10
的副本并将其称为
a
。类似的语法也适用于引用类型,但不同的是没有复制;将创建一个引用

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

为了更好地说明这一点,这里有另一个例子:

struct SomeValueType {
    public SomeValueType(){        
    }
}

public static readonly SomeValueType DEFAULT = new SomeValueType();
然后你可以这样做:

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

现在假设
SomeValueType
Int32
DEFAULT
10
。就在那里

您可能见过Java,其中
int
Integer
是两个不同的东西,后者要求您编写
新整数(10)

在C#
int
中,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
您可能会认为,由于第二个赋值覆盖了第一个赋值,因此不需要第一个赋值。

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

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

因此,您的程序与:

int i = 0;
i = 10;

如果你写的代码像

int A = new Int();
变量“A”由int的默认值赋值,因此您可以使用变量“A”而不给它赋值(在
c
中,如果不给它赋值,我们就不能使用变量) 当使用关键字new时,它将自动调用默认构造函数,并为变量分配默认值

int A = new Int();
它声明
A
并将其初始化为
0


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

它具有与以下相同的效果:

int A = 0;

前者创建的对象更少,更清晰,效率更高。System.Int32的可能副本不是整数:)@DaveShaw-是。。我的坏:)这不是一件物品吗?在Java中,
Long
是一个对象,
Long
是一个原语。@svick-这正是我所说的:\把10想象成以前声明的Int32的实例。@svick-hmm。。我重读了一遍,我明白这可能是错误的。我会编辑。为什么C#设计器不为它定义一个额外的ctor,这样我们就可以调用
inti=newint(10)不必先设置为0?欢迎使用StackOverflow!下一次请查看标记:)基本上,这里的新运算符用于调用值类型的默认构造函数。对于int类型,默认值为0。int不是有效的.NET类型。使用new Int32()或new int()