2015-04-08 3 views
0

В настоящее время изучается C# при выходе из C++.Указатель на экземпляр объекта как свойство класса B (C#)

У меня есть важный класс, который необходимо разделить между несколькими классами. Пример кода в C++:

// The important class 
class Foo { 
    // ... 
} 

// Class that needs an instance of Foo 
class Bar { 
public: 
    Bar(Foo* foo); 
    // ... 

protected: 
    Foo* m_foo; // <- holds pointer to instantiated Foo-object 
} 

Bar::Bar(Foo* foo) 
    : m_foo(foo) {} 

И, возможно, больше классов, таких как Bar, которые должны знать свойства определенного экземпляра Foo. Мне нравится использовать этот метод по нескольким причинам:

  • Вам не нужно постоянно обновлять m_foo. Особенно полезно, если существует ряд классов, которые изменяют его свойства и ряд классов, которые используют его свойства. Он быстро выходит из-под контроля.
  • Отсутствие нескольких копий экземпляра Foo.
  • Вам не обязательно передавать экземпляр Foo в качестве аргумента все время.

Вопрос: Есть ли в C# эквиваленты?


Что не возможно или нежелательная:

  • Имея указатель на класс как собственность. Другими словами, копирование кода C++ на C#. Ключевое слово unsafe не относится к указателям на классы. Ключевое слово fixed работает только внутри тел.
  • Передача объекта в качестве аргумента в каждой отдельной функции.
  • Обновление новых значений каждому классу, который в нем нуждается, и, следовательно, копия, лежащая повсюду. Неэффективен как для использования памяти, так и будет значительно медленнее.

ответ

2

Если я правильно понимаю ваш вопрос, вы хотите сделать что-то вроде этого:

 
public class Foo { 
    //... 
} 

public class Bar { 
    protected Foo m_foo; 

    //C# passes by reference for objects, so any changes to Foo would be reflected 
    //in m_foo 
    public Bar(Foo foo){ 
     m_foo = foo; 
    } 
} 

public main(){ 
    Foo foo = new Foo(); 
    Bar bar = new Bar(foo); 
    Bar bar2 = new Bar(foo); 
    foo = null; 
    //Both bar and bar2 have the same reference to foo. 
    //Any changes to foo from bar will be visible to bar2 
    //Even though foo is set to null, the object is not actually removed 
    //since both bar and bar2 have a reference to it. 
} 
+0

Welp, который был немым. Классы являются ссылочным типом, поэтому их свойства никогда не копируются ... Большое спасибо! – Didii

Смежные вопросы