假设我有以下程序:
public class Wallet
{
private int _money;
public Wallet(int money)
{
_money = money;
}
}
public class Person
{
private string _name;
private Wallet _wallet;
public Person(string name)
{
_wallet = new Wallet(0);
_name = name;
}
}
class TestClass
{
static void Main(string[] args)
{
var person = new Person("Toto");
}
}
如果我理解的很好:
person
的引用将存储在堆栈中Person
的成员将存储在堆上,所以_name
和_wallet
_money
被Wallet
持有,它也会被存储在堆上我想知道是否实际上,
_wallet
的引用也会存储在堆栈中,然后 _money
和 _name
存储在堆中。
对吗?
PS:通常我会注射
Wallet
,但这不适合我的问题。
person
引用是局部变量,因此它进入调用堆栈。像 _wallet
这样的实例属性不是局部变量,所以它进入堆中,因为它属于整个类。
首先堆栈是一个实现细节,第一部分(第二部分)。
至于什么存储在哪里——内存分配用于存储引用类型的数据/信息,原因很明显,存储在堆上,这包括值和引用类型的字段(和属性的支持字段),不同之处在于存储的内容为堆上的对象分配的内存(对于值类型,它将是值本身,用于引用 - 对堆上另一个对象的引用)。
所以在这种情况下,存储在
_wallet
中的引用将作为该字段引用的对象在堆上。
另请阅读:
你的理解是正确的。在您提供的示例中,对
Person
对象(即类的实例)的引用存储在堆栈中,而对象的成员 _name
和 _wallet
存储在堆中。
_wallet
成员是对Wallet
对象的引用,该对象也存储在堆中。所以,_money
对象的Wallet
成员也存储在堆上。
更准确地说,
_wallet
成员本身的实际内存位置作为Person
对象的一部分存储在堆上。此内存位置保存对也存储在堆中的Wallet
对象的引用。