在使用new关键字时,是要区分两种情况的,值类型和引用类型的new是不一样的
1.值类型(如struct)和new
值类型通常都是在栈上分配内存的
使用new创建一个值类型的实例时,并不涉及内存分配。new关键字在这里的作用是调用值类型的构造函数,并初始化字段。
struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Point p = new Point(10, 20); // 调用构造函数并在栈上分配
不使用new,仍然可以调用默认的无参构造函数,未初始化的结构体字段将保持默认值。
结构体等值类型,除非是在类中被定义,才会出现在堆上,否则一般都是在栈上存储
2.引用类型(如class)和new
引用类型是默认在堆上分配内存的
使用new创建一个引用类型时,第一步,堆内存 会被分配(在内存上划一段空间,返回改内存的地址),用于存储对象的实际数据。
第二步,new会调用该类的构造函数来初始化对象
class MyClass
{
public int X;
public int Y;
public MyClass(int x, int y)
{
X = x;
Y = y;
}
}
MyClass obj = new MyClass(10, 20); // 在堆上分配内存,并调用构造函数
引用类型的变量只是指向堆中对象的引用,它本身存储在栈上(如果是局部变量的话,如果是静态/全局变量的话,存储在静态内存区),但引用指向的实际对象存储在堆中。
3.值类型的默认值
值类型(如int,float,bool,struct,enum)在不初始化时,也有一个默认值,如int是0,bool是false等
int num; // 默认值为 0
bool flag; // 默认值为 false
Point p; // p.X 和 p.Y 的默认值为 0
引用类型(如class,string,object,array)存储的是对象的引用,而不是对象的数据,当没用new出一个对象或赋值一个对象地址时,默认值是null。表示该引用变量没用指向有效的对象。
MyClass obj; // 默认值为 null
string text; // 默认值为 null