c# 4.0 - c#中的类访问

本文关键字:访问 | 更新日期: 2023-09-27 17:52:12

是否有一种方法在c#(4+)的class A (instanceOfClassA)在class B的实例访问变量x(如在SomeMethodInClassA)没有x是公共的(见下面的代码示例)?

<>之前A类{B linkToClassB;空白SomeMethodInClassA (){linkToClassB。X = 1;}};B类{Public int x;//这应该可以从类A访问,而不是公共的instanceOfClassA;…};之前

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

c# 4.0 - c#中的类访问

有两种方法可以使A能够访问x,而不需要将类作为同一层次结构的一部分:

嵌套类

如果AB内部的嵌套类,那么A可以访问x:

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

internal access

如果这两个类在同一个程序集中,并且xinternal,那么A有可能访问它。当然,在这种情况下,也可以从同一程序集中的所有其他类访问x,这可能是不可取的。

class A
{
    B linkToClassB;
    void SomeMethodInClassA() { linkToClassB.x = 1; }
}
class B
{
    internal int x;
    A instanceOfClassA;
}

可以将x声明为

internal int x;

,只要AB在同一个程序集中,它就可以工作。internal正是为这种情况提供的,在c#中它是唯一的机制。

如果允许访问其他类的私有成员,那么EncapsulationOOP中的作用将被破坏。

你不能访问其他类的private成员,除非你使用Property(需要是公共的)或Reflection

您可以使用接口的显式实现公开该属性。这样,使用对接口的引用可以访问该属性,但使用对类的引用无法访问该属性:

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; } }
};

internal关键字将做您想要的。它只允许从同一程序集内部访问(例如DLLEXE)。然而,更重要的是,您应该考虑为什么您需要这种类型的功能。最佳实践是避免耦合(两个类相互依赖)。是否可以在对象AB构造函数中传递一些东西以允许它们共享数据?也许在 a B上具有set访问器的public属性?

在某些情况下,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类,因为它严格用于底层实现细节。

您可以将其设置为internal,因此只有该程序集/DLL中的类才能访问它,包括A。但是可能有一个更好的模式,这取决于你想用它来做什么。