new 关键字

在使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值