为什么在 C# 中方法调用会影响对象,而赋值却会改变引用? [重复]

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

我正在使用 C# 并遇到一些令人困惑的语法。这是我所拥有的:

public void Foo(StringBuilder sb) {
    sb.Append("test");     
    sb = null; }  

StringBuilder myStringBuilder = new StringBuilder(); 
Foo(myStringBuilder); 
Console.WriteLine(myStringBuilder.ToString()); // Still prints "test" 

我期望在方法内设置 `sb = null;` 也会将 `myStringBuilder` 设置为 `null`,(因为 sb.Append("test") 将值附加到实际对象而不是指针),但事实并非如此。我知道 `sb` 只是引用的副本,因此为它分配 `null` 不会影响原始对象引用。

1.这到底是如何工作的?为什么方法内部将 `sb` 设置为 `null` 不会影响外部的 `myStringBuilder` 引用? (让我困惑的是 sb.Append() 和 sb = null 之间的语法差异。一个更改对象,另一个更改引用)

2.如果我真的想在方法内将原始对象设置为“null”,我该怎么做?我听说过使用“ref”关键字,但我不确定这会如何改变事情。 任何有关此语法以及引用在这种情况下如何工作的澄清将不胜感激!

我已经阅读了这个问题,但找不到合适的解释。我还读过有关重新绑定、赋值和突变的内容,但不太明白。

c# .net object pointers reference
2个回答
0
投票

您将对对象的引用(

StringBuilder
是引用类型)传递给方法。方法内部只有自己的引用副本,并且您只会影响“本地引用” - 因此,当您在方法内部取消引用时,它只会影响本地变量,而不影响不依赖的对象。

您传递给函数的对象引用保持不变,这就是您在

Console.Writeline

中看到结果的原因

0
投票

sb
是对 StringBuilder 对象的引用。

null
分配给引用只会将
sb
重新引用到
null
,从而有效地删除对 StringBuilder 对象的本地引用。

sb.Append()
对所引用的对象进行操作。

您的方法无法更改 myReference,因为这只是对 StringBuilder 对象的另一个引用。

StringBuilder myStringBuilder = new StringBuilder();

基本上就是:创建一个新的匿名 StringBuilder 对象并创建一个名为 myStringBuilder 的 StringBuilder 引用来引用该对象。

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