我正在使用 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”关键字,但我不确定这会如何改变事情。 任何有关此语法以及引用在这种情况下如何工作的澄清将不胜感激!
我已经阅读了这个问题,但找不到合适的解释。我还读过有关重新绑定、赋值和突变的内容,但不太明白。
您将对对象的引用(
StringBuilder
是引用类型)传递给方法。方法内部只有自己的引用副本,并且您只会影响“本地引用” - 因此,当您在方法内部取消引用时,它只会影响本地变量,而不影响不依赖的对象。
您传递给函数的对象引用保持不变,这就是您在
Console.Writeline
中看到结果的原因
sb
是对 StringBuilder 对象的引用。
将
null
分配给引用只会将 sb
重新引用到 null
,从而有效地删除对 StringBuilder 对象的本地引用。
而
sb.Append()
对所引用的对象进行操作。
您的方法无法更改 myReference,因为这只是对 StringBuilder 对象的另一个引用。
StringBuilder myStringBuilder = new StringBuilder();
基本上就是:创建一个新的匿名 StringBuilder 对象并创建一个名为 myStringBuilder 的 StringBuilder 引用来引用该对象。