为什么我们在创建自定义数据类型时必须使用“new”关键字,而不是在C#中使用float,int,string和bool等基本数据类型?

时间:2017-07-15 16:08:48

标签: c# new-operator primitive-types built-in-types

就像我上面提到的那样,我知道new关键字将在堆上分配内存。我知道基本数据类型,如float,int,bool等..生活在堆栈上。但是,当你想在堆上分配数据时,为什么必须使用new?为什么当您从类中创建对象时需要使用new关键字?为什么在创建基本变量时不需要使用新关键字?堆上还有阵列吗?

此问题特定于C#

2 个答案:

答案 0 :(得分:2)

如果您有引用类型的变量,则可以为其指定现有对象

b = a; // Where a is another variable.

或为其分配新创建的对象

b = new A(); // Where A is a type.

或指定nullnull是引用类型的唯一预先存在的常量值(字符串除外)。

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的值赋给变量myIntOrig156本身在内存中使用空间,并且不需要实例化new 156