Стек является деталью реализации, или нет?

Согласно http://msdn.microsoft.com/en-us/library/ms229017.aspx, типы значения "выделяются на стеке или встроенные с другими структурами*". Все же в стеке деталь реализации, Eric Lippert заявляет, что это - деталь реализации.

К моему пониманию деталь реализации является "поведением, произведенным кодом, на который можно полагаться путем потребления кода, хотя то поведение не указано спецификацией, код написан к".. Я понимаю, что документация не является спецификацией, хотя, по-видимому, если что-то перечислено в документации, что мы можем полагаться на нее и это больше не деталь implmentation. Так, действительно ли стек является деталью реализации или не так ли?

*: Я понимаю это, чтобы означать, что структуры могут также быть выделены в других вместо непосредственно на "куче", хотя я мог быть неправым.

5
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

В документации MSDN рассказывается о конкретной реализации, которую компилятор Microsoft C# использует для struct. Эти конкретные детали не входят в спецификацию ECMA 334 C#; они не являются частью семантики structs. Поэтому эти детали в документации являются деталями реализации.

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

Вот, из записи в блоге, на которую вы ссылались:

Я сожалею, что документация не сфокусирована на том, что является наиболее релевантным; концентрируясь на во многом неактуальных деталях реализации, мы увеличиваем важность этих деталей реализации и скрываем важность того, что делает тип значения семантически полезным. Мне бы очень хотелось, чтобы все эти статьи, объясняющие, что такое "стек", вместо этого потратили время на объяснение того, что именно означает "копирование по значению" и как неправильное понимание или неправильное использование "копирование по значению" может привести к ошибкам.

Соответствующий раздел спецификации ECMA 334 C# - это §11. Заметьте, что слово "стек" никогда не используется в этом разделе. В этом разделе просто поясняется синтаксис, что structs следуют семантике значений, что они неявно запечатаны и наследуются от System. ValueType, присваивание переменной типа struct создает копию, передача struct в качестве параметра по значению создает копию, как structs устанавливаются в значения по умолчанию (все поля типа значения в struct устанавливаются в их значения по умолчанию, и все поля ссылочного типа установлены в null), правила боксирования и распаковки struct, значение this для structs и как инициализируются поля, конструкторы, деструкторы и статические конструкторы работают для structs. Опять же, никаких упоминаний о стеках. Ever.

Стек - это реализационная деталь, а не часть семантики struct.

.
11
ответ дан 13 December 2019 в 05:36
поделиться

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

Операции, для которых это имеет значение (т.е. заканчиваются обращением к кадру разделенного стека), такие как взятие адреса и непосредственное его использование (например, через старые API), являются небезопасными и ошибочными (т.е. не используют API Маршала).

.
1
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: