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

问题描述 投票:0回答:1

我一直使用私有和公共方法。但是,我不明白它们为什么起作用。 创建一个小型 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 如何区分和验证私人/公共规则是否得到遵守?

c# .net visual-studio
1个回答
9
投票

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

.method private hidebysig instance void privateHelloWorld () cil managed 

.method public hidebysig instance void publicHelloWorld () cil managed 

仅此而已。请参阅此 Common Type System MSDN 页面中的辅助功能部分。

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

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

在 Program.Main(String[] args)

因此由运行时执行的可访问性检查。

© www.soinside.com 2019 - 2024. All rights reserved.