【发布时间】:2013-03-11 17:08:59
【问题描述】:
当声明一个 int..
int A = 10;
为什么不做以下呢?
int A = new Int()
A=10;
都一样吗?
【问题讨论】:
-
前者创建的对象更少,更清晰,更高效。
当声明一个 int..
int A = 10;
为什么不做以下呢?
int A = new Int()
A=10;
都一样吗?
【问题讨论】:
因为int 是Int32 的语法糖,它是一个值类型。顺便说一句,常数值10(value 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!
现在假设SomeValueType 是Int32 并且DEFAULT 是10。来了!
【讨论】:
Long 是一个对象,long 是一个原语。
你可能见过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
你可能会想,由于第二个赋值覆盖了第一个,所以第一个赋值不是必需的。
【讨论】:
在 C# 中有两种类型,“引用类型”和“值类型”。 (指针是第三种类型,但我们先不谈。)
当您使用值类型的默认构造函数时,您所说的只是“给我这个值类型的默认值”。所以new int() 不仅仅是说0。
所以你的程序是一样的:
int i = 0;
i = 10;
【讨论】:
int i=new int(10); 而不必先设置为 0?
如果你写你的代码像
int A = new Int();
变量'A'由int的默认值赋值,所以你可以使用变量'A'而不给它赋值(在c#中,我们不能在没有赋值的情况下使用变量)
当使用关键字new时,它会自动调用默认构造函数,它会为变量分配默认值。
【讨论】:
int A = new Int();
它将A声明并初始化为0。
基本上,这里的 new 运算符用于调用值类型的默认构造函数。对于 int 类型,默认值为 0。
和下面的效果一样:
int A = 0;
【讨论】: