C# 在C语言中,为什么不使用';新';声明int时的关键字?
当声明一个intC# 在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 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()