это может быть очень простой вопрос, но я не смог найти ответ здесь, на SO, и не знал никого, кому я задал ответ:
Я могу написать простой метод c #вроде этого:
private void foo()
{
int a = 1;
int b = 5;
}
Если код CIL -(, созданный компилятором ), выполняется общеязыковой средой выполнения, она создаст следующие поля поверх стека, в то время как исполняемый элемент управления находится внутри метода:
b = 5
a = 1
Но теперь я расширяю метод для доступа к полю с именем «a» до этого:
private void foo()
{
int a = 1;
int b = 5;
Console.WriteLine(a);
}
Теперь CLR должна получить доступ к полю, которое не находится на вершине стека, но в соответствии с принципом FILO (first in, last out )она должна позаботиться обо всех полях над запрошенными полями перед доступом к нему..
Что происходит с полем под названием «b», которое находится в стеке над запрошенным полем «a»?
CLR не может удалить его, так как впоследствии он может быть использован исполняемым методом, так что же с ним происходит?
Насколько я знаю, есть только два способа сохранить поле, стек или кучу. Перемещение его в кучу не имело бы особого смысла, так как это лишит вас всех преимуществ стекирования из CLR. Создает ли CLR что-то вроде второго стека?
Как это работает?
-редактировать-
Возможно, я недостаточно ясно объяснил свои намерения.
Если я напишу такой метод:
private void foo()
{
int a = 1;
int b = 5;
Console.WriteLine(a);
Console.WriteLine(b);
}
CLR сначала записывает 2 поля в стек, а затем обращается к ним, но в обратном порядке.
Во-первых, он должен получить доступ к полю "a", но чтобы добраться до него, CLR должна позаботиться о поле "b", которое находится над полем "a" в стеке. Он не может просто удалить поле «b» из стека, так как впоследствии он должен получить к нему доступ.
Как это работает?