2015-07-28 3 views
1

Из того, что я знаю о C# (я считаю, что я прав), типы значений выделяются в стеке, а ссылочные типы alllocated в куче. Но если поле в классе является типом значения, оно выделяется в куче, а не в стеке (я все еще прав, верно?).Должен ли стек быть действительно выделен в программе на C#?

С учетом сказанного я также знаю, что каждая программа C# является классом и состоит из классов. Это должно означать, что любая переменная, объявленная в программе C#, тип значения или ссылочный тип, должна быть выделена в куче.

Что я могу сделать, так это то, что стек не может быть действительно использован в программе на C#. Я говорю «может», потому что могут быть экстраординарные случаи, а не то, что я знаю их.

+1

Локальные переменные функций/методов (за некоторыми исключениями) выделяются в стеке в Microsoft .NET. Вы обычно используете функции/методы в своем коде? Я :-) – xanatos

+0

Так почему мы получаем StackOverflowExceptions? –

+0

Я не знал об этом. Спасибо, что сообщили. Кажется, это единственный случай для стеков, верно? – afaolek

ответ

4

Вы в основном правильно :)

переменные, которые являются локальными для метода, однако, действительно выделяется из стека. Это вся правда для типов значений. Для ссылочных типов фактический объект, строка, массив и т. Д. Выделяется в куче, но сам указатель выделяется в стеке.

+0

Хмммм ... Я просто подумал об этом. Означает ли это, если я использую указатели в небезопасном коде, они также будут выделены в стеке? – afaolek

+0

Локальная ссылочная переменная (указатель) получает выделение в стеке, да, но то, что она указывает на то, что она находится в куче. Вы можете смело передать копию такой ссылки на неуправляемую процедуру - вы, как правило, захотите ее сначала прикрепить, когда вы это сделаете, чтобы сборщик мусора не перемещал данные в памяти. –

1

Тип ссылки хранится в куче. Это верно для типов значений, которые содержатся в ссылочном типе. Напротив, в стеке хранится ссылка на объект, который хранится в куче.

Что касается переменных, которые являются локальными для метода, который указал 500 - Внутренняя ошибка сервера. Они выделяются в стек.

+0

Почему кто-то ответил на этот вопрос? Я думаю, это правда, тоже – afaolek

Смежные вопросы