相关疑难解决方法(0)

.NET参数传递 - 按值引用v/s

我试图验证我对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传递时会出现一些误解,这并不是基于我的想法.我错了,这就是为什么我来到堆叠器.

.net c# clr value-type reference-type

17
推荐指数
2
解决办法
1万
查看次数

标签 统计

.net ×1

c# ×1

clr ×1

reference-type ×1

value-type ×1