2010-12-20 7 views
6

時々、私は本当に友人が必要です。C#とVB.NETでC++の友達をシミュレートするには?

私は、次のトリックを考えることができます:

  1. 読み取り専用のラッパーを - ReadOnlyCollectionのように。友人はポインタを変更可能なオブジェクトに保持しますが、他の人はラッパーだけにアクセスできます。
  2. 書込み委任 - フレンドはオブジェクトのコンストラクタにパラメータの1つとしてデリゲートへの参照を渡し、コンストラクタはそのオブジェクトを変更するために使用できるプライベートメソッドのアドレスを埋め込みます。
  3. 反射 - 明らかに悪い考えです。完全性のために含まれています。
  4. 複数のアセンブリ - あなたの友達を別々のアセンブリにまとめ、修飾子メソッドをinternalに設定します。
  5. 変更可能オブジェクトを公開しますが、修飾子メソッドにコメントを追加します。「これはインフラストラクチャメソッドです - 呼び出さないでください!
  6. Nested classes.
  7. 友人のみにアクセスしてIntelliSenseから非表示にするメンバーに属性を追加します(System.ComponentModel.EditorBrowsable(System.ComponentModel. EditorBrowsableState.Never))。
  8. 暗黙のインターフェイスの実装 - コメントを参照してください。

このリストは網羅的ですか?誰でもパフォーマンスを低下させる順番で並べ替えることができますか?減少したきちんとした秩序?どちらを使うべきなの?

+2

おそらくネストされたタイプは忘れています。 –

+1

もちろん、暗黙のインターフェイス実装。実際にメソッドを隠すわけではありませんが、それにアクセスするには何かをする必要があります(このインターフェイスにキャスト)。 – Alex

+0

ネストされたタイプを使用して友人をシミュレートするにはどうすればよいですか? –

答えて

6

InternalsVisibleTo属性を使用することもできます。

特定のアセンブリAでは、Aの内部型にアクセスできる他のアセンブリを指定できます。 (プライベートクラスのような)C#入れ子のクラスで

3

は、C++の友人に似ています:

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

    public int b; 

    public class FriendOfRoot 
    {   
     public int d; 
    } 

} 

編集:ここで提供されるネストされたクラスと友人のシミュレーションがパフォーマンスで、あなたのために有用である場合はそれが高速です通常のクラスのように十分です(コンパイルではすべてのことが決定され、キャストの問題はなく、オーバーヘッドはありません)。

関連する問題