我试图验证我对 C#/.NET/CLR 如何处理值类型和引用类型的理解。我读了很多自相矛盾的解释,我仍然
这是我今天的理解,如果我的假设是错误的,请纠正我。
值类型(例如 int 等)存在于堆栈中,引用类型存在于托管堆中,但是如果引用类型具有例如 double 类型的实例变量,它将与它的对象一起存在于堆中
第二部分是我最困惑的。
让我们考虑一个名为 Person 的简单类。
Person 有一个名为 Name 的属性。
假设我在另一个类中创建了一个 Person 实例,我们将其称为 UselessUtilityClass。
考虑以下代码:
class UselessUtilityClass
{
void AppendWithUnderScore(Person p)
{
p.Name = p.Name + "_";
}
}
然后我们做的某处:
Person p = new Person();
p.Name = "Priest";
UselessUtilityClass u = new UselessUtilityClass();
u.AppendWithUnderScore(p);
Person 是一个引用类型,当传递给 UselessUtilityClass - 这是我要去的地方 - 坚果......作为 Person 引用实例的VARIABLE p 由VALUE传递,这意味着当我写 p.Name 我会看到“牧师_”
然后如果我写
Person p2 = p;
我愿意
p2.Name = "不是牧师";
并像下面这样写 p 的名字我会得到“不是牧师”
Console.WriteLine(p.Name) // will print "Not a Priest"
这是因为它们是引用类型并且指向内存中的相同地址。
我的理解正确吗?
我认为当人们说.NET 中的所有对象都由 Reference 传递时存在一些误解,这与我的想法并不相符。我可能是错的,这就是我来到 Stackers 的原因。