对于class A
中的instanceOfClassA
(class B
)实例,C#(4+)中是否有办法访问变量x(如SomeMethodInClassA
中所述) x是公开的(参见下面的代码示例)?
class A { B linkToClassB; void SomeMethodInClassA() { linkToClassB.x = 1; } }; class B { public int x; // This should be accessible from class A without being public A instanceOfClassA; ... };
我想知道因为instanceOfClassA
是class B
的成员,所以可能有一种方法允许类访问其成员类的特定方法。
答案 0 :(得分: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;
}
答案 1 :(得分:2)
您可以将x
声明为
internal int x;
只要A
和B
在同一个程序集中就可以使用。 internal
正是为这种情况提供的,而在C#中它是唯一的机制。
答案 2 :(得分:1)
如果您被允许访问其他类的私人成员,则Encapsulation
中OOP
的目的将被销毁。
除非您使用private
(需要公开)或Property
Reflection
成员
答案 3 :(得分: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; } }
};
答案 4 :(得分:1)
internal
关键字可以满足您的需求。它只允许从相同的程序集(想想 DLL 或 EXE )进行访问。
但更重要的是,你应该想到为什么你想要这种类型的功能。最好的做法是避免耦合(两个类相互依赖)。是否可以在对象 A 或 B 的构造函数中传递某些内容以允许它们共享数据?可能是 A 或 B 上具有public
访问者的set
媒体资源?
有些情况下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
类,因为它严格用于底层实现细节。
答案 5 :(得分:0)
你可以使它internal
,所以只有那个程序集/ DLL中的类可以访问它,包括A.
但是可能有更好的模式,取决于你想用它做什么。