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