1

在 C# (4+) 中,class A( instanceOfClassA) in的实例是否可以在不公开 x的情况下class B访问变量 x (如 in )(参见下面的代码示例)?SomeMethodInClassA

    A级
    {
    B 链接到ClassB;

    无效的 SomeMethodInClassA()
    {
    链接到ClassB.x = 1;
    }
    };

    B类
    {
    公共整数 x;// 这应该可以从类 A 访问而不是公开的

    A instanceOfClassA;
    ...
    };

我想知道,因为 asinstanceOfClassA的成员class B可能有一种方法可以允许类访问其成员类的特定方法。

4

6 回答 6

3

有两个选项可以在类不属于同一层次结构的情况下A进行访问:x

嵌套类

如果A是一个嵌套类,B那么A可以访问x

class B {
    private int X;
    A instanceOfClassA;

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

internal使用权

如果这两个类在同一个程序集中并且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除非您使用(Property需要公开)或Reflection

于 2013-01-12T18:20:43.387 回答
1

internal关键字会做你想做的事。它只允许从同一个程序集中访问(想想DLLEXE)。

然而,更重要的是,您应该考虑为什么需要这种类型的功能。最好的做法是避免耦合(两个类相互依赖)。可以在对象AB的构造函数中传递允许它们共享数据的东西吗?也许是在AB上有访问器的属性?publicset

在某些情况下,internal最好的选择是,但就像螺丝刀可以用来敲钉子一样,它并不是所有事情的最佳方法。internal如果其他所有选项都不可行,我建议您将其用作最后的手段。

为了让您了解internal关键字的用途,让我们考虑从C#中调用平台 ( pInvoke ) Win32 函数:

[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 回答
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 回答
0

您可以制作它internal,因此只有该程序集/DLL 中的类可以访问它,包括 A。但可能有更好的模式,具体取决于您想用它做什么。

于 2013-01-12T18:22:46.867 回答