如何保存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’并且重新赋值它不再改变输入变量。 有没有解决的办法?
不是,不是。 到下次调用代码时,用作方法参数的原始变量可能不再存在:
void Foo() { MyClass x = Bar(); x.ModifyApple(); } MyClass Bar() { Apple apple = new Apple(); return new MyClass(ref apple); }
这里, apple
是一个局部变量,位于堆栈框架中,在我们调用ModifyApple
时会弹出。
您确定需要修改原始调用者的变量而不仅仅是更改对象本身吗?
解决这种问题的一种方法是使用包装类型开头:
public class MutableWrapper { public T Value { get; set; } }
然后传入MutableWrapper
,并将其存储在您的class级中。 然后在ModifyApple
你可以写:
wrapper.Value = new Apple();
这不会改变调用者的变量 ,但下次调用者查看Value
属性时,他们会看到你的新苹果。
说实话,这种事情往往会导致难以维护的代码,甚至ref
也不具备可读性。 如果你能够解释你想要实现的目标的大局,我们可能会建议一个更好的整体方法。
ref
-ness是您传递给函数的函数和参数的参数的属性。 它通常不是变量(甚至是字段)的属性。
事实上,你在那里尝试的东西从一开始就注定要失败。
不,没有。 myApple
是一个包含对Apple
的引用的字段; 然而,参数apple
实际上是对Apple的引用参考。 将apple
分配给myApple
可以取消引用参数的值 。 除此之外,它们是分开的和独特的。
所以没有:这是不可能的。
有可能是这样的:
public class AppleWrapper { public Apple Value {get;set;} }
现在; 如果您存储AppleWrapper
,任何数量的呼叫者都可以访问和更改 .Value
为什么不让ModifyApple
返回修改后的Apple实例?
上述就是C#学习教程:如何保存ref变量供以后使用?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
public Apple ModifyApple() { myApple = new Apple("Macintosh"); // does not change the input variable like the first example did return myApple; }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1044170.html