Согласно http://msdn.microsoft.com/en-us/library/ms229017.aspx, типы значения "выделяются на стеке или встроенные с другими структурами*". Все же в стеке деталь реализации, Eric Lippert заявляет, что это - деталь реализации.
К моему пониманию деталь реализации является "поведением, произведенным кодом, на который можно полагаться путем потребления кода, хотя то поведение не указано спецификацией, код написан к".. Я понимаю, что документация не является спецификацией, хотя, по-видимому, если что-то перечислено в документации, что мы можем полагаться на нее и это больше не деталь implmentation. Так, действительно ли стек является деталью реализации или не так ли?
*: Я понимаю это, чтобы означать, что структуры могут также быть выделены в других вместо непосредственно на "куче", хотя я мог быть неправым.
В документации MSDN рассказывается о конкретной реализации, которую компилятор Microsoft C# использует для struct
. Эти конкретные детали не входят в спецификацию ECMA 334 C#; они не являются частью семантики struct
s. Поэтому эти детали в документации являются деталями реализации.
я, кажется, помню, как читал где-то Эрик Липперт, говоря, что он хочет (или предпочитает, я не помню, какого уровня предпочтений он отдал), чтобы в документации не упоминался стек в связи со структурой struct
s. Посмотрим, смогу ли я откопать его.
Вот, из записи в блоге, на которую вы ссылались:
Я сожалею, что документация не сфокусирована на том, что является наиболее релевантным; концентрируясь на во многом неактуальных деталях реализации, мы увеличиваем важность этих деталей реализации и скрываем важность того, что делает тип значения семантически полезным. Мне бы очень хотелось, чтобы все эти статьи, объясняющие, что такое "стек", вместо этого потратили время на объяснение того, что именно означает "копирование по значению" и как неправильное понимание или неправильное использование "копирование по значению" может привести к ошибкам.
Соответствующий раздел спецификации ECMA 334 C# - это §11. Заметьте, что слово "стек" никогда не используется в этом разделе. В этом разделе просто поясняется синтаксис, что struct
s следуют семантике значений, что они неявно запечатаны и наследуются от System. ValueType
, присваивание переменной типа struct
создает копию, передача struct
в качестве параметра по значению создает копию, как struct
s устанавливаются в значения по умолчанию (все поля типа значения в struct
устанавливаются в их значения по умолчанию, и все поля ссылочного типа установлены в null
), правила боксирования и распаковки struct
, значение this
для struct
s и как инициализируются поля, конструкторы, деструкторы и статические конструкторы работают для struct
s. Опять же, никаких упоминаний о стеках. Ever.
Стек - это реализационная деталь, а не часть семантики struct
.
Для типов значений C# 'стек' является реализацией, так как каждая безопасная операция, выполняемая над типом значения, будет вести себя одинаково, ортогонально тому, была ли структура выделена на стеке или на куче.
Операции, для которых это имеет значение (т.е. заканчиваются обращением к кадру разделенного стека), такие как взятие адреса и непосредственное его использование (например, через старые API), являются небезопасными и ошибочными (т.е. не используют API Маршала).
.