如何保存ref变量供以后使用?

Joe*_*ams 16 c# reference ref

所以这有效..

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'并且重新赋值它不再改变输入变量.有没有解决的办法?

Joe*_*oey 9

ref-ness是要传递给函数的函数和参数的参数的属性.它通常不是变量(甚至是字段)的属性.

事实上,你在那里尝试的东西从一开始就注定要失败.


Jon*_*eet 6

不是,不是.到下次调用代码时,用作方法参数的原始变量可能不再存在:

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对可读性也不是很好.如果你能够解释你想要实现的目标的大局,我们可能会建议一个更好的整体方法.