2015-07-18 3 views
0

Я знаю, что это может быть ссылка на другой объект в методе с использованием ключевого слова 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 тоже становится нулевым! Как это возможно?

+1

Когда-нибудь глобальные переменные так полезны для снятия стресса ..... (шучу, я не думаю, что это возможно, давайте посмотрим, если кто-то есть лекарство) – Steve

+1

Это не возможно, как таковой, вы будете должны иметь какую-то систему событий или использовать свойство из этого класса всюду, чтобы достичь этого. –

+1

Пожалуйста, посмотрите здесь http://stackoverflow.com/a/7253417/3888877 –

ответ

1

Это не возможно сделать именно то, что вы просите, но вы можете достичь функциональности, если обернуть 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; 
     } 
    } 
+0

Спасибо за ваш ответ. Это было полезно. Но в чем разница между '_wrapper.Input = null;' и '_wrapper = null;'? Первый - глобальный, а второй - локальный. Зачем? –

+2

Подумайте о ссылке, как напечатанная страница с указаниями, как перейти на какой-то адрес. Если у вас и у меня будет копия с тем же адресом «A», мы оба придем в одно и то же место A, но все же вы смотрите на одну страницу, и я смотрю на другую. Теперь подумайте, что кто-то может стереть адрес с вашей страницы и написать там другой адрес: «B». Итак, теперь, если вы будете следовать указаниям на своей странице, вы придете к адресу B, пока я все еще прихожу к адресу A. Помещение null в ссылку похоже на удаление адреса с вашей страницы, поэтому у вас есть пустая страница. У меня все еще есть страница с адресом A. –

+1

В предлагаемом решении ссылка на объект WrapperClass имеет ссылку на фактический класс: OtherClass. Точно так же, даже если у нас есть страницы, вы никогда не удаляете адрес со своей страницы, поэтому мы всегда имеем один и тот же адрес, а затем, когда мы идем по тому же адресу, мы находим там еще одну страницу с направлением на следующий адрес. Если кто-то разрастает эту страницу, мы оба приходим к адресу A, находим эту страницу и видим, что она пуста (null). Надеюсь, эта аналогия была в порядке. –

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 метода, который выходит за рамки ,

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; } 
    }   
Смежные вопросы