Стек
Це stack
блок пам'яті для зберігання local variables
і parameters
. Стек логічно зростає і зменшується, коли функція входить і виходить із неї.
Розглянемо наступний метод:
public static int Factorial (int x)
{
if (x == 0)
{
return 1;
}
return x * Factorial (x - 1);
}
Цей метод є рекурсивним, що означає, що він називає себе. Кожного разу, коли метод вводиться, у стеці виділяється новий int , і кожен раз, коли метод виходить, int звільняється .
Купи
- Купа - це блок пам'яті, в якому
objects
(тобто reference-type instances
) знаходиться. Щоразу, коли створюється новий об'єкт, він виділяється в купі і повертається посилання на цей об'єкт. Під час виконання програми купа починає заповнюватися, коли створюються нові об'єкти. У середовищі виконання є збирач сміття, який періодично вивільняє об’єкти з купи, тому ваша програма не працює Out Of Memory
. Об’єкт підлягає звільненню, як тільки на нього не посилається щось, що є самим собою alive
.
- Купи теж зберігає
static fields
. В відміну від об'єктів , виділених в купі (який може отримати збірку сміття), these live until the application domain is torn down
.
Розглянемо наступний метод:
using System;
using System.Text;
class Test
{
public static void Main()
{
StringBuilder ref1 = new StringBuilder ("object1");
Console.WriteLine (ref1);
StringBuilder ref2 = new StringBuilder ("object2");
StringBuilder ref3 = ref2;
Console.WriteLine (ref3);
}
}
У наведеному вище прикладі ми починаємо зі створення об’єкта StringBuilder, на який посилається змінна ref1, а потім виписуємо його вміст. Тоді цей об’єкт StringBuilder негайно придатний для збору сміття, оскільки згодом його ніщо не використовує. Потім ми створюємо ще один StringBuilder, на який посилається змінна ref2, і копіюємо це посилання на ref3. Незважаючи на те, що після цього пункту ref2 не використовується, ref3 зберігає той самий об’єкт StringBuilder живим - гарантуючи, що він не стане придатним для збору, поки ми не закінчимо використовувати ref3.
Екземпляри типу значення (і посилання на об’єкти) живуть всюди, де була оголошена змінна. Якщо екземпляр був оголошений як поле в межах типу класу або як елемент масиву, цей екземпляр живе в купі.