对c#中通过ref/value传递感到困惑
本文关键字:value ref | 更新日期: 2023-09-27 18:17:49
由于我还在学习c#,所以在标题中有些东西对我来说还没有点击,下面是一些我正在使用的真正基本的代码,只是为了掌握它。
[TestMethod]
public void Pass()
{
int x = 4;
Increment(x);
Assert.AreEqual(5, x);
}
void Increment(int num)
{
num++;
}
我知道如果我添加ref,它会工作得很好,但是我看到使用它并不总是最好的情况。我可以做什么,而不是使用ref和为什么?
- 不要改变调用者的状态。返回新的
int
值作为返回值。一般情况下应避免状态突变。 - 如果可用,继续使用ref。除了状态突变问题之外,它没有任何问题。
- 使用堆上的对象,例如内置的
class IntHolder { int MyInt; }
或StrongBox<int>
。
[TestMethod] public void Pass() {
int x = 4;
x = Increment(x);
Assert.AreEqual(5, x);
}
int Increment(int num) {return ++num; }
如果你设置不使用passing by ref.
本质上,当不通过ref传递时,你给被调用的方法一个原始对象的副本。所以你在增量中对它的更改不会反映在原始值上(除非像这里一样,你从方法返回新值并在赋值中使用它)。
当通过ref传递时,你给被调用的方法一个对原始对象的引用。在这种情况下,任何修改都是在原来的基础上进行的。
希望对你有帮助。