Где хранится поле типа int, объявленное в классе?

Ответ

Поле int, объявленное как член класса (class), хранится в управляемой куче (heap). Оно является неотъемлемой частью памяти, выделенной для экземпляра этого класса.

Правило: Данные экземпляра класса (поля, включая типы значений) всегда размещаются в куче вместе с заголовком объекта.

Пример для сравнения:

// КЛАСС: поле в куче
class MyClass
{
    public int NumberInHeap; // Часть объекта MyClass в куче.
}

// СТРУКТУРА: поле хранится там же, где и сама структура.
struct MyStruct
{
    public int NumberFollowsStruct; // В стеке, если struct — локальная переменная.
                                    // В куче, если struct — поле другого класса.
}

void Example()
{
    // Экземпляр класса (и его поле 'NumberInHeap') — в КУЧЕ.
    MyClass obj = new MyClass();
    obj.NumberInHeap = 42;

    // Экземпляр структуры (и его поле 'NumberFollowsStruct') — в СТЕКЕ.
    MyStruct localStruct;
    localStruct.NumberFollowsStruct = 24;
}

Практический вывод: Нельзя сказать "int всегда в стеке". Контекст (класс vs структура, локальная переменная vs поле) полностью определяет место хранения. Поле класса — часть объекта в куче.

Ответ 18+ 🔞

Давай разжую эту тему, как последнюю котлету в столовой, чтобы даже у самого упоротого джуна в голове щёлкнуло.

Смотри, народ часто тупит на этом моменте, как баран на новые ворота. Говорят: "int — тип значения, значит, он в стеке!" И тут же, блядь, сами себе противоречат. Это как сказать "бензин — жидкость, значит, он всегда в канистре". А если он в баке машины? А если в зажигалке, ёпта?

Вот смотри на пальцах, без этой вашей заумной хуйни.

Главное правило, которое надо выжечь в мозгу калёным железом:
Поле, объявленное внутри класса, — это часть объекта. А объект класса живёт в куче (heap). Всё, что внутри него — даже эти самые int, bool, double — сидят там же, в этой самой куче, рядышком с заголовком объекта. Они от объекта не отрываются, как жопка от унитаза после морозной ночи.

А теперь, чтобы совсем пиздец стало понятно, смотри пример. Я его тут накатал, но объясню человеческим языком.

Представь, что класс — это дом на хуторе, который ты построил на арендованной земле (это куча). В нём живёт твой кот Васька (поле int NumberInHeap). Где Васька? В доме, на хуторе, в куче. Вне дома его нет.

class MyClass
{
    public int NumberInHeap; // Это Васька. Он в доме (в куче).
}

А структура — это не дом, это палатка. Её можно поставить где угодно.

  • Если ты поставил палатку прямо у себя во дворе (создал локальную переменную структуры в методе), то и всё, что в ней, — тоже во дворе (в стеке).
  • Но если ты эту же палатку засунул внутрь своего дома на хуторе (сделал полем класса), то она теперь — часть дома. И стоит, значит, на хуторе, в куче.
struct MyStruct
{
    public int NumberFollowsStruct; // Это спальник в палатке. Где палатка, там и он.
}

void Example()
{
    // Дом (класс) строим в куче. Васька (поле int) сразу там.
    MyClass obj = new MyClass(); // Всё это — в куче.
    obj.NumberInHeap = 42; // Ваське дали сметаны.

    // Палатку (структуру) ставим прямо тут, на стеке.
    MyStruct localStruct; // Всё это — в стеке.
    localStruct.NumberFollowsStruct = 24; // Спальник распаковали.
}

Итог, блядь, короткий и ясный:
Говорить "int всегда в стеке" — это такой же пиздёж, как "водка всегда в стакане". Она может быть и в бутылке, и в графине, и, прости господи, в желудке. Всё зависит от контекста, ёпта. Поле класса — это часть объекта, а объект — царь и бог кучи. Запомни это, и не позорься на собеседованиях.