2015-04-08 101 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

韋爾普,那是愚蠢的。類是一個引用類型,所以它們的屬性確實從不復制......非常感謝! – Didii