如何在当前对象中保持对另一个对象的引用

本文关键字:一个对象 引用 对象 | 更新日期: 2023-09-27 18:03:19

我知道通过使用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也变成null !这怎么可能呢?

如何在当前对象中保持对另一个对象的引用

这是不可能做的事情,你正在问,但你可以实现的功能,如果你包装你的OtherClass与WrapperClass

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;
        }
    }
  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; } 
   }          

这不起作用,因为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();
}

此时,invalidMakeRef方法中引用了一个局部变量,这超出了作用域。