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

时间:2011-08-31 06:33:42

标签: c# reference ref

所以这有效..

public MyClass(ref Apple apple)
{
    apple = new Apple("Macintosh"); // Works fine
}

但是可以这样做吗?

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
}

当ref变量被复制到成员变量myApple时,它似乎失去了'ref-ness'并重新分配它不再改变输入变量。有办法解决这个问题吗?

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:6)

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

void Foo()
{
    MyClass x = Bar();
    x.ModifyApple();
}

MyClass Bar()
{
    Apple apple = new Apple();
    return new MyClass(ref apple);
}

此处,apple是一个本地变量,位于堆栈框架中,在我们调用ModifyApple时会弹出。

您确定需要修改原始来电者的变量,而不仅仅是更改对象本身吗?

排序假冒的一种方法是使用包装类型开头:

public class MutableWrapper<T>
{
    public T Value { get; set; }
}

然后传入MutableWrapper<Apple>,并将其存储在您的班级中。然后在ModifyApple中你可以写:

wrapper.Value = new Apple();

这不会改变来电者的变量,但下次来电者查看Value属性时,他们会看到你的新苹果。

说实话,这种事情往往会导致难以维护的代码,甚至ref对于可读性也不是很好。如果你能够解释你想要实现的目标的大局,我们可能会建议一个更好的整体方法。

答案 2 :(得分:3)

不,没有。 myApple是一个包含对Apple的引用的字段;但是,参数apple实际上是对Apple的引用参考。当您将apple分配给myApple时,取消引用参数的值。除此之外,它们是分开的和不同的。

所以不:这是不可能的。

的可能性是:

public class AppleWrapper {
    public Apple Value {get;set;}
}

现在;如果您存储AppleWrapper,则任意数量的来电者都可以访问并更改 .Value

答案 3 :(得分:0)

为什么不让ModifyApple返回修改后的Apple实例?

public Apple ModifyApple()
{
    myApple = new Apple("Macintosh"); // does not change the input variable like the first example did
    return myApple;
}