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

时间:2015-07-18 20:42:43

标签: c# reference parameter-passing pass-by-reference

我知道可以使用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也变为空!怎么可能?

3 个答案:

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