Как С# проверяет частное определение С#?
Я использую частные и общедоступные методы все время. Однако я не понимаю, почему они работают.
Создание небольшой программы 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)
Таким образом, выполняется проверка доступности, выполняемая средой выполнения.