Время жизни переменных в циклах

Суть вопроса такова, помню когда-то читал что когда мы выходим из цикла то переменная счётчик "уничтожается", но сегодня вот прошёлся отладчиком и заметил что переменная почему-то помнит своё значение, а также читал что если переменная что объявлена в теле цикла "уничтожается" и создаётся вновь при каждой новой итерации цикла. Вот пример кода который я отлаживал, это метод сортировки выбором и меня ставит в тупик то, что переменная minIndex почему-то помнит своё значение после первой итарации, а также счётчик j помнит своё значение на второй итерации внешнего цикла.

private static void SelectionSort(int[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                int minIndex = i;
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (array[minIndex] > array[j])
                    { 
                        minIndex = j;
                    }
                }
                int tmp = array[i];
                array[i] = array[minIndex];
                array[minIndex] = tmp;
            }
        }

Ответы (1 шт):

Автор решения: aepot

Локальные переменные не имеют времени жизни. Они имеют область видимости { }. Переменная, объявленная в конкретной области ложится в стек или регистр и живет там до конца области видимости, а в некоторых случаях может быть физически перемещена из стека в регистр и обратно во время выполнения, но это решает компилятор.

Если речь о примитивах, структурах типа int, то под них вообще память может не выделяться. Например int переменная может существовать только в регистре процессора, а в оперативе ее физически может не быть. Для более сложных структур может потребоваться аллокация в стеке, которая выполняется просто увеличением значения регистра, указывающего на вершину стека.

Что касается ссылочных типов, то под них память выделяется отдельно в куче сборщиком мусора, и им же впоследствии собирается. На текущем этапе изучения достаточно знать только то что сборщик своё дело знает и раньше времени ничего не уничтожит.

Поля класса живут в куче независимо от типа и уничтожаются вместе с экземпляром этого класса.

Что касается minIndex, то это тот самый регистр, у него нет никакого времени жизни, есть просто регистр, где живет значение. Во время выполнения переменных не существует вообще, процессор оперирует значениями, а не переменными. Что касается j, то вне внутреннего цикла ее не существует. Даже если отладчик показывает ее присутствие, то логически ее все равно нет, вы не сможете ей воспользоваться за пределами области видимости внутреннего цикла. Можно списать ее отображение при отладке причудами самого отладчика.

→ Ссылка