就像我上面提到的那样,我知道new关键字将在堆上分配内存。我知道基本数据类型,如float,int,bool等..生活在堆栈上。但是,当你想在堆上分配数据时,为什么必须使用new?为什么当您从类中创建对象时需要使用new关键字?为什么在创建基本变量时不需要使用新关键字?堆上还有阵列吗?
此问题特定于C#
答案 0 :(得分:2)
如果您有引用类型的变量,则可以为其指定现有对象
b = a; // Where a is another variable.
或为其分配新创建的对象
b = new A(); // Where A is a type.
或指定null
。 null
是引用类型的唯一预先存在的常量值(字符串除外)。
b = null;
new
表明创建了一个新对象。这也运行构造函数。无论是堆还是堆栈都不重要。字符串在C#中以特殊方式处理。尽管它们是引用类型,但它们具有值类型语义,因为它们是不可变的并且具有与值类型非常相似的常量(文字)。您可以使用new
创建它们,因此,当您想要将字符数组转换为字符串时,例如。
引用类型的变量始终包含引用或null
。这意味着它总是占用相同数量的内存(32位或64位,具体取决于操作系统和进程类型)。
另一方面,当你有一个值类型时,你要么指定一个常量值(不能创建它)。
x = 5;
或者您要分配另一个值的副本
x = t;
请注意,结构也是值类型。如果您希望运行构造函数,则必须使用new
创建它们。
p = new Point(1, 2);
但结构数组或结构数组的元素存在而不是使用new
创建的。它们的所有字段和属性都会自动初始化为默认值。
var points = new Point[10];
使用坐标(0,0)创建十个点。永远不会调用单点的构造函数。
答案 1 :(得分:1)
首先:new
关键字没有"在堆上分配内存"。
new
关键字用于实例化实例,原型或非基元。
其次,如果你有这个;
ClassDefined myClassOrig = new ClassDefined();
ClassDefined myClassCopy = myClassOrig;
您没有使用new
关键字将myClassOrig
分配给myClassCopy
。对于int来说它是一样的。
你有:
int myIntOrig = 156;
int myClassCopy = myIntOrig;
其他类型也是如此:
string myStringExample = "some string";
Vector3 myVectorExample = Vector3.zero;
问题是,156
或"some string"
或Vector3.zero
是(作为new ClassDefined()
)实例/值的某些内容,并且您将该实例/值分配给变量。
当您使用156
之类的int值时,您将156
的值赋给变量myIntOrig
。 156
本身在内存中使用空间,并且不需要实例化new 156
。