当operator new()
与引用类型一起使用时,实例的空间在堆上分配,引用变量本身放在堆栈上。除此之外,在堆上分配的引用类型实例中的所有内容都被清零。
例如这里是一个类:
class Person
{
public int id;
public string name;
}
在以下代码中:
class PersonDemo
{
static void Main()
{
Person p = new Person();
Console.WriteLine("id: {0} name: {1}", p.id, p.name);
}
}
p
变量在堆栈上,并且Person
(其所有成员)的创建实例在堆上。p.id
将是0
并且p.name
将是null
。之所以会出现这种情况,是因为在堆上分配的所有内容都归零。
现在我感到困惑的是,如果我使用带有new
运算符的值类型。例如,考虑以下结构:
struct Date
{
public int year;
public int month;
public int day;
}
class DateDemo
{
static void Main()
{
Date someDate;
someDate= new Date();
Console.WriteLine("someDate is: {0}/{1}/{2}",
someDate.month, someDate.day, someDate.year);
}
}
现在我想知道 main 中的以下几行是做什么的:
Date someDate;
someDate= new Date();
在第一行someDate
变量分配在堆栈上。正好是 12 个字节。
我的问题是第二行会发生什么?做什么operator new()
?它只是将Date
结构的成员清零还是在堆上分配空间?一方面,我不希望new
在堆上分配空间,当然因为在第一行内存已经在堆栈上分配给结构实例。另一方面,我希望new
在堆上分配空间并返回该空间的地址,因为这是new
应该做的。也许这是因为我来自 C++ 背景。
然而,如果答案是:“当new
与值类型一起使用时,它只会将对象的成员清零”,那么new
运算符的含义有点不一致,因为:
- 与值类型一起使用时
new
,它只会将堆栈上的对象成员清零 - 与引用类型一起使用时
new
,它会在堆上为实例分配内存并将其成员归零
在此先感谢,
干杯