Когда структуры не живут в стеке? - PullRequest
5 голосов
/ 10 февраля 2009

Я читаю рецензии на книги Джона Скита, и он перебирает многочисленные неточности из Head First C # .

Один из них привлек мое внимание:

[Под разделом ошибок] Утверждение, что структуры всегда живут в стеке.

В каких ситуациях структуры не живут в стеке? Это идет вразрез с тем, что я думал о структурах.

Ответы [ 6 ]

7 голосов
/ 10 февраля 2009

Одним из распространенных примеров является то, что структура является членом объекта, который размещен в куче. В этом вопросе есть много дополнительных деталей. В чем разница между struct и class в .Net?

4 голосов
/ 10 февраля 2009

Всякий раз, когда они являются полем в классе

Необычные примеры этого:

a: При захвате переменной типа значения:

int i = 2;
Action action = delegate {i++;}
action();
Console.WriteLine(i);

Это скомпилировано во что-то вроде:

class Foo {
    public int i;
    public void Bar() {i++;}
}
...
Foo foo = new Foo();
foo.i = 2;
Action action = foo.Bar;
action();
Console.WriteLine(foo.i);

b: когда переменная типа значения используется в блоке итератора:

IEnumerable<int> GetValues() {
   for(int i = 0 ; i < 5 ; i++) yield return i;
}

(компилятор генерирует конечный автомат для представления итератора, все локальные переменные которого (например, i) являются полями)

2 голосов
/ 10 февраля 2009

Просто в качестве примера ответ от 1800 ИНФОРМАЦИЯ :

public class Foo
{
    int x;

    public Foo(int y)
    {
        x = y;
    }
}

...

Foo foo = new Foo(10);

Теперь, после того как конструктор завершил выполнение, значение foo.x равно 10. Где находится foo.x в памяти? В кучу. Какой тип foo.x? int aka System.Int32, который является структурой.

Другие ответы о захваченных переменных, боксах и т. Д. Также верны («вроде» в случае с боксом - я добавлю комментарий), но этот пример является наиболее простым и самым важным, IMO.

2 голосов
/ 10 февраля 2009

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

Структура является типом значения. Таким образом, он ведет себя как выше.

0 голосов
/ 27 января 2012

Книга совершила ошибку, перепутав механику набора текста с механикой области видимости. Тип значения не является ссылочным типом. Эти данные копируются, когда вы вызываете метод, используя его в качестве аргумента (без ref или out). Типы значений будут жить в стеке в области видимости метода, а не в куче, как это делает эталонный объект, но это не означает, что он всегда будет жить в стеке.

Итак, книга делает заявление об использовании вместо механического утверждения и смешивает их. Это не полная безосновательная претензия, но это неправильно.

Типы значений будут храниться везде, где находится их владелец.

Так что, если их область действия - метод, они будут в стеке. Если их область видимости - объект, они будут жить с объектом в куче.

При этом можно с уверенностью сказать, что тип значения лучше оставить неизменным, поскольку большинству людей трудно предсказать механику типа значения по значению.

0 голосов
/ 10 февраля 2009

Уже подробно упоминается другими

  • Значения полей члена
  • штучные структуры (тогда они больше не являются типами значений)

Дополнительно:

  • Массив структур полностью находится в куче
  • статические структуры (не в стеке и не в куче, а в отдельной области)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...