我知道可以使用ref
关键字引用方法中的其他对象。以下示例中创建的对象在方法内部也可用。
public Method(ref OtherClass input)
{
input = new OtherClass();
}
但我需要领先一步。我需要将引用作为我的对象中的属性保存,并在将来随时随地更改原始对象。
public class CLass1
{
OtherClass _input;
public Bind(ref OtherClass input)
{
input = new OtherClass(); // instantiating the object
_input = input; // keeping a reference of the created object for later usage!
}
public void Unbind()
{
_input = null;
}
}
当我Bind
对象时,原始对象用新对象初始化,这正是我想要的。但之后我运行Unbind()
,只有_ input
变为空,input
保持不变。我需要input
也变为空!怎么可能?
答案 0 :(得分:1)
不可能完全按照你要求的那样做,但如果你用WrapperClass包装你的OtherClass可以实现这个功能
public class WrapperClass
{
public OtherClass Input;
}
public class CLass1
{
WrapperClass _wrapper;
public Bind(ref WrapperClass wrapper)
{
wrapper = new WrapperClass();
wrapper.Input = new OtherClass(); // instantiating the object
_wrapper = wrapper; // keeping a reference of the created object for later usage!
}
public void Unbind()
{
_wrapper.Input= null;
}
}
答案 1 :(得分:0)
这不起作用,因为ref
仅作为方法的参数有意义。您不能存储超出方法范围的引用,因为您不知道通过引用传递给方法的变量的范围。例如,想想如果你这样做会发生什么:
class WithRef {
// Imagine you can do this
public ref OtherClass other;
public WithRef(ref OtherClass other) {
this.other = other;
}
}
现在让我们说你这样做:
WithRef MakeRef() {
OtherObject variable;
return new WithRef(ref variable);
}
void Test() {
var invalid = MakeRef();
}
此时invalid
引用了MakeRef
方法中的局部变量,该变量超出了范围。
答案 2 :(得分:0)
public abstract class SelfRefType
<T extends< SelfRefType<T>> {
private OtherType<T>_ref;
protected abstract T getThis();
public void set() {
_ref.m( getThis() ); }
}
public interface OtherType<E> {
void m(E arg);
}
public Subtype extends
SellfRefType<Subtype> {
protected Subtype getThis() {
return this; }
}