所以这有效..
public MyClass(ref Apple apple)
{
apple = new Apple("Macintosh"); // Works fine
}
Run Code Online (Sandbox Code Playgroud)
但有可能做这样的事情吗?
private Apple myApple;
public MyClass(ref Apple apple)
{
myApple = apple;
}
public void ModifyApple()
{
myApple = new Apple("Macintosh"); // does not change the input variable like the first example did
}
Run Code Online (Sandbox Code Playgroud)
当ref变量被复制到成员变量时,myApple它似乎失去了它的'ref-ness'并且重新赋值它不再改变输入变量.有没有解决的办法?
不是,不是.到下次调用代码时,用作方法参数的原始变量可能不再存在:
void Foo()
{
MyClass x = Bar();
x.ModifyApple();
}
MyClass Bar()
{
Apple apple = new Apple();
return new MyClass(ref apple);
}
Run Code Online (Sandbox Code Playgroud)
这里apple是一个局部变量,在堆栈框架中,它将在我们调用的时间弹出ModifyApple.
您确定需要修改原始调用者的变量而不仅仅是更改对象本身吗?
解决这种问题的一种方法是使用包装类型开头:
public class MutableWrapper<T>
{
public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后传入MutableWrapper<Apple>,并将其存储在您的班级中.然后ModifyApple你可以写:
wrapper.Value = new Apple();
Run Code Online (Sandbox Code Playgroud)
这不会改变调用者的变量,但下次调用者查看Value属性时,他们会看到你的新苹果.
说实话,这种事情往往会导致难以维护的代码,甚至ref对可读性也不是很好.如果你能够解释你想要实现的目标的大局,我们可能会建议一个更好的整体方法.
| 归档时间: |
|
| 查看次数: |
7864 次 |
| 最近记录: |