C# 中 referenceTyes 存储的 referenceTypes 保存在哪里?

问题描述 投票:0回答:3

假设我有以下程序:

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");
    }
}

如果我理解的很好:

  1. person
    的引用将存储在堆栈中
  2. referenceType持有的成员存储在堆上,因此
    Person
    的成员将存储在堆上,所以
    _name
    _wallet
  3. 因为
    _money
    Wallet
    持有,它也会被存储在堆上

我想知道是否实际上,

_wallet
的引用也会存储在堆栈中,然后
_money
_name
存储在堆中。

对吗?

PS:通常我会注射

Wallet
,但这不适合我的问题。

c# stack heap reference-type
3个回答
0
投票

person
引用是局部变量,因此它进入调用堆栈。像
_wallet
这样的实例属性不是局部变量,所以它进入堆中,因为它属于整个类。


0
投票

首先堆栈是一个实现细节,第一部分第二部分)。

至于什么存储在哪里——内存分配用于存储引用类型的数据/信息,原因很明显,存储在堆上,这包括值和引用类型的字段(和属性的支持字段),不同之处在于存储的内容为堆上的对象分配的内存(对于值类型,它将是值本身,用于引用 - 对堆上另一个对象的引用)。

所以在这种情况下,存储在

_wallet
中的引用将作为该字段引用的对象在堆上。

另请阅读:


0
投票

你的理解是正确的。在您提供的示例中,对

Person
对象(即类的实例)的引用存储在堆栈中,而对象的成员
_name
_wallet
存储在堆中。

_wallet
成员是对
Wallet
对象的引用,该对象也存储在堆中。所以,
_money
对象的
Wallet
成员也存储在堆上。

更准确地说,

_wallet
成员本身的实际内存位置作为
Person
对象的一部分存储在堆上。此内存位置保存对也存储在堆中的
Wallet
对象的引用。

© www.soinside.com 2019 - 2024. All rights reserved.