我一直使用私有和公共方法。但是,我不明白它们为什么有效。创建一个小型的 Hello World 程序:
public class CallPublicHelloWorld
{
public void CallHelloWorld()
{
publicHelloWorld();
privateHelloWorld();
}
private void privateHelloWorld()
{
Console.WriteLine("Hello World");
}
public void publicHelloWorld()
{
Console.WriteLine("Hello World");
}
}
为公共方法创建的 IL
:IL_0000: nop
IL_0001: ldstr "Hello World"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
为私有方法创建的 IL
:IL_0000: nop
IL_0001: ldstr "Hello World"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
这是完全相同的。
JIT 如何区分和验证是否遵循了私有/公共规则?
您省略了生成的 IL 中的相关行:
.method private hidebysig instance void privateHelloWorld () cil managed
.method public hidebysig instance void publicHelloWorld () cil managed
仅此而已。请参阅此通用类型系统 MSDN 页中的辅助功能部分。
当修改 IL 以调用私有方法并使用 ilasm 编译它时,在运行时你将获得:
未处理的异常:System.MethodAccessException:尝试通过方法"Program.Main(System.String[])"访问方法"CallPublicHelloWorld.privateHelloWorld()"失败。
at Program.Main(String[] args)
因此,运行时会执行可访问性检查。