C#如何验证C#私有定义?

Dud*_*ord 14 .net c# compiler-construction visual-studio

我一直使用私有和公共方法.但是,我不明白他们为什么工作.创建一个小型Hello World程序:

public class CallPublicHelloWorld
{
    public void CallHelloWorld()
    {
        publicHelloWorld();
        privateHelloWorld();
    }

    private void privateHelloWorld()
    {
        Console.WriteLine("Hello World");
    }

    public void publicHelloWorld()
    {
        Console.WriteLine("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

IL为公共方法创建:

IL_0000:  nop
IL_0001:  ldstr      "Hello World"
IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret
Run Code Online (Sandbox Code Playgroud)

IL为私有方法创建:

IL_0000:  nop
IL_0001:  ldstr      "Hello World"
IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret
Run Code Online (Sandbox Code Playgroud)

它完全相同.

JIT如何区分并验证遵守私人/公共规则?

Cod*_*ter 9

您从生成的IL中省略了相关的行:

.method private hidebysig instance void privateHelloWorld () cil managed 

.method public hidebysig instance void publicHelloWorld () cil managed 
Run Code Online (Sandbox Code Playgroud)

这就是它的全部内容.请参阅此Common Type System MSDN页面中的辅助功能部分.

当修改IL以调用私有方法并使用ilasm编译它时,在运行时你会得到:

未处理的异常:System.MethodAccessException:尝试通过方法'Program.Main(System.String [])'访问方法'CallPublicHelloWorld.privateHelloWorld()'失败.

在Program.Main(String [] args)

因此,有在运行时执行的可访问性检查.