Как С# проверяет частное определение С#?

Я использую частные и общедоступные методы все время. Однако я не понимаю, почему они работают. Создание небольшой программы 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_0000:  nop
IL_0001:  ldstr      "Hello World"
IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret

ИЛ, созданный для частного метода:

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

Это то же самое.

Как JIT различает и проверяет, соблюдались ли частные/публичные правила?

Ответы

Ответ 1

Вы пропустили соответствующие строки из сгенерированного 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)

Таким образом, выполняется проверка доступности, выполняемая средой выполнения.