1

C#(4+)で、class AinstanceOfClassA)inのインスタンスがxを公開せずclass Bに(のように)変数xにアクセスする方法はありSomeMethodInClassAますか(以下のコード例を参照)?

    クラスA
    {{
    B linkToClassB;

    void SomeMethodInClassA()
    {{
    linkToClassB.x = 1;
    }
    };

    クラスB
    {{
    public int x; //これは公開せずにクラスAからアクセスできる必要があります

    instanceOfClassA;
    ..。
    };

instanceOfClassAのメンバーであるclass Bため、クラスがメンバークラスの特定のメソッドにアクセスできるようにする方法があるのではないかと思いました。

4

6 に答える 6

3

クラスが同じ階層の一部でなくてもAアクセスできるようにするための2つのオプションがあります。x

ネストされたクラス

が内部にAネストされたクラスである場合、アクセスできます:BAx

class B {
    private int X;
    A instanceOfClassA;

    private class A {
        B linkToClassB;
        void SomeMethodInClassA() { linkToClassB.x = 1; }
    }
}

internalアクセス

2つのクラスが同じアセンブリ内にあり、そうである場合はx、それにアクセスするinternalことができAます。もちろん、この場合x、同じアセンブリ内の他のすべてのクラスからもアクセスできますが、これは望ましくない場合があります。

class A
{
    B linkToClassB;

    void SomeMethodInClassA() { linkToClassB.x = 1; }
}

class B
{
    internal int x;
    A instanceOfClassA;
}
于 2013-01-12T18:21:44.183 に答える
2

xあなたはとして宣言することができます

internal int x;

ABが同じアセンブリ内にある限り、それは機能します。internalこの種の状況のた​​めに正確に提供されており、C#ではそれが唯一のメカニズムです。

于 2013-01-12T18:22:13.360 に答える
1

他のクラスのプライベートメンバーへのアクセスが許可された場合、Encapsulationinの目的OOPそのものが破壊されます。

(公開する必要がある)またはをprivate使用しない限り、他のクラスのメンバーにアクセスすることはできません。PropertyReflection

于 2013-01-12T18:20:43.387 に答える
1

インターフェイスの明示的な実装を使用して、プロパティを公開できます。このように、インターフェイスへの参照を使用してプロパティに到達できますが、クラスへの参照を使用してプロパティに到達することはできません。

public class A {

  private AccessB linkToB;

  void SomeMethodInClassA() {
    linkToB.X = 1;
  }

}

public interface AccessB {

  int X { get; set; }

}

public class B : AccessB {

  private int x;

  int AccessB.X { get { return x; } set { x = value; } }

};
于 2013-01-12T18:29:36.773 に答える
1

キーワードはinternalあなたが望むことをします。同じアセンブリ内からのアクセスのみを許可します( DLLまたはEXEを考えてください)。

ただし、さらに重要なのは、このタイプの機能が必要な理由を考える必要があることです。結合を回避することをお勧めします(2つのクラスが相互に依存しています)。オブジェクトAまたはBのコンストラクターに、データを共有できるようにする何かを渡すことはできますか?おそらく、AまたはBのいずれかにアクセサがあるプロパティですか?publicset

最良の選択である場合もありますがinternal、ドライバーを使用して釘を打つことができるのと同じように、それがすべてに最適なアプローチになるわけではありません。internal他のすべてのオプションが実行可能でない場合は、最後の手段として使用することをお勧めします。

キーワードが何に適しているかを理解するために、 C#内からのプラットフォーム呼び出し( pInvoke)Win32関数internalについて考えてみましょう。

[Flags]
internal enum ProcessAccessFlags : uint
{
  None = 0x0,
  VmOperation = 0x8,
  VmRead = 0x10,
  VmWrite = 0x20,
  QueryInformation = 0x400
}

internal static class NativeMethods
{
  [DllImport("kernel32")]
  internal static extern IntPtr OpenProcess(ProcessAccessFlags desiredAccess,
                                            bool inheritHandle,
                                            int processId);
  [DllImport("kernel32")]
  internal static extern bool ReadProcessMemory(IntPtr hProcess, 
                                                IntPtr baseAddress,
                                                byte[] buffer,
                                                int count, 
                                                out int numberOfBytesRead);

  [DllImport("kernel32")]
  internal static extern bool WriteProcessMemory(IntPtr hProcess, 
                                                 IntPtr baseAddress,
                                                 byte[] buffer,
                                                 int count, 
                                                 out int numberOfBytesWritten);

  [DllImport("kernel32")]
  internal static extern int ResumeThread(IntPtr hThread);

  [DllImport("kernel32")]
  internal static extern bool CloseHandle(IntPtr handle);
}

internal私のライブラリのさまざまなクラスがアクセスなどを必要とする可能性があるため、ここでキーワードは非常に意味がありますNativeMethods.CloseHandle()NativeMethodsただし、クラスライブラリは厳密に内部実装の詳細のためのものであるため、クラスライブラリを使用する可能性のある人にクラスへのアクセスを許可したくありません。

于 2013-01-12T18:53:20.910 に答える
0

あなたはそれを作ることができるinternalので、そのアセンブリ/ DLLのクラスだけがAを含めてそれにアクセスできます。しかし、あなたがそれで何をしたいかによっては、より良いパターンがあるかもしれません。

于 2013-01-12T18:22:46.867 に答える