2010-12-20 49 views
6

因爲有時候,我真的需要一個朋友。如何在C#和VB.NET中模擬C++的朋友?

我能想到的招數如下的:

  1. 只讀包裝 - 像ReadOnlyCollection。朋友保持指向可修改對象的指針,而其他人只能訪問包裝器。
  2. 寫代理 - 朋友給對象的構造函數一個委託的引用作爲參數之一,構造函數用一個地址填充到可用於修改對象的私有方法。
  3. 反思 - 顯然是一個壞主意。包括完整性。
  4. 多個裝配 - 將你的朋友放在一個單獨的裝配中,並設置修改方法internal
  5. 公開可修改對象,但爲修飾符方法添加註釋「這是一種基礎結構方法 - 不要調用它!」
  6. Nested classes.
  7. System.ComponentModel.EditorBrowsable(System.ComponentModel. EditorBrowsableState.Never)屬性添加到您希望只有朋友才能訪問的成員以將其隱藏到智能感知中。
  8. 隱式接口實現 - 請參閱註釋。

這份清單是否詳盡?任何人都可以按照性能下降的順序排序嗎?減少整潔的順序?任何建議何時使用哪些?

+2

你可能忘記了嵌套類型。 – 2010-12-20 17:30:05

+1

而且,當然還有隱式的接口實現。沒有真正隱藏該方法,但您需要做一些操作才能訪問它(轉換到此界面)。 – Alex 2010-12-20 17:35:37

+0

如何使用嵌套類型來模擬朋友? – 2010-12-20 17:42:09

回答

6

您還可以使用InternalsVisibleTo屬性。

對於給定的程序集A,您可以指定哪些其他程序集可以訪問A的內部類型。

3

在C#中的嵌套類(如私有類)是在C類似於朋友++:

public class Root 
{ 
    private int a; // accessible for friendroot 

    public int b; 

    public class FriendOfRoot 
    {   
     public int d; 
    } 

} 

編輯:如果朋友在這裏提供的嵌套類的模擬是對您有用,在性能上它的速度快足夠像普通班級(在編譯的時候所有的東西都會被確定下來,並且不存在投射問題,也沒有開銷)。