c# 4.0 - c#中的类访问
本文关键字:访问 | 更新日期: 2023-09-27 17:52:12
是否有一种方法在c#(4+)的class A
(instanceOfClassA
)在class B
的实例访问变量x(如在SomeMethodInClassA
)没有x是公共的(见下面的代码示例)?
我想知道,因为instanceOfClassA
是class B
的成员,可能有一种方法允许一个类访问其成员类的特定方法。
有两种方法可以使A
能够访问x
,而不需要将类作为同一层次结构的一部分:
如果A
是B
内部的嵌套类,那么A
可以访问x
:
class B {
private int X;
A instanceOfClassA;
private class A {
B linkToClassB;
void SomeMethodInClassA() { linkToClassB.x = 1; }
}
}
internal
access
如果这两个类在同一个程序集中,并且x
是internal
,那么A
有可能访问它。当然,在这种情况下,也可以从同一程序集中的所有其他类访问x
,这可能是不可取的。
class A
{
B linkToClassB;
void SomeMethodInClassA() { linkToClassB.x = 1; }
}
class B
{
internal int x;
A instanceOfClassA;
}
可以将x
声明为
internal int x;
,只要A
和B
在同一个程序集中,它就可以工作。internal
正是为这种情况提供的,在c#中它是唯一的机制。
如果允许访问其他类的私有成员,那么Encapsulation
在OOP
中的作用将被破坏。
你不能访问其他类的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
关键字将做您想要的。它只允许从同一程序集内部访问(例如DLL或EXE)。然而,更重要的是,您应该考虑为什么您需要这种类型的功能。最佳实践是避免耦合(两个类相互依赖)。是否可以在对象A或B的构造函数中传递一些东西以允许它们共享数据?也许在 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。但是可能有一个更好的模式,这取决于你想用它来做什么。