C # эквивалент константного указателя / указателя на констант в переполнении стека

Я изучаю основы C ++, пришедшие из мира .NET (C #).

Одна тема, которую я нашел интересной, была Const ключевое слово и его использование с указателями (указатель const / указатель на const).

Я хотел бы знать, есть ли какой-нибудь язык C #, эквивалентный константному указателю / указателю на const, который есть в C ++?
(Я знаю, что C # не имеет указателей, я рассматриваю ссылки как типы указателей в C #).

Кроме того, из интереса, если нет такого эквивалента, какие решения стояли за исключением такой функции?

3

Решение

В C # нет прямого эквивалента передачи ссылок как «const», но есть альтернативные способы достижения этой цели. Наиболее распространенный способ сделать это — сделать ваш ссылочный класс либо полностью неизменным (после создания его состояние никогда не должно изменяться), либо передать его в качестве неизменяемого открытого интерфейса. Последний наиболее близок к намерению контракта параметра «const» (я даю вам ссылку на что-то, чтобы вы могли использовать это, но я прошу вас не менять его.) Плохо ведущий себя клиент мог бы » конечно, отвергать открытый интерфейс в изменчивую форму, но это все же проясняет намерение. Вы также можете «выбросить» const в C ++, подумав, что это редко хорошая идея.


Еще одна вещь в C ++ состоит в том, что вы часто предпочитаете передавать как const, когда вы знали, что время жизни ссылки, которую вы передавали, было ограничено по объему. C ++ часто следует шаблону, в котором объекты создаются и уничтожаются в стеке в пределах области действия метода, поэтому любые ссылки на эти объекты не должны сохраняться за пределами этой области (поскольку их использование после того, как они выходят за пределы области действия, может привести к очень неприятным сбоям при повреждении стека.) Ссылка на const не должна быть видоизменена, так что это сильный намек на то, что хранить ее где-то для ссылки позже будет плохой идеей. Метод с константными параметрами обещает, что эти объемные ссылки безопасно передавать. Поскольку C # никогда не позволяет хранить ссылки на объекты в стеке (вне параметров), это не представляет особой проблемы.

5

Другие решения

Концепция постоянных объектов (т.е. readonly) в C # (или Java в этом отношении) соответствует примерно object *const в C ++, то есть постоянный указатель на непостоянный объект.

Есть несколько причин для этого — для одного уточнения const правильно и сделать его полезным на языке довольно сложно. Взяв c ++ в качестве примера, вы должны дважды определить множество методов с небольшими изменениями сигнатуры, есть const_cast, тот факт, что const применяется только поверхностно и т. Д.

Так что C # пошел на простое решение, чтобы сделать язык проще — D пошел другой путь с транзитивной правильностью констант и т. д., как я понимаю (никогда не писал ни одной строки в D, поэтому возьмем это с крошкой соли).

Обычное решение в C # / Java состоит в том, чтобы иметь неизменные классы, возможно, используя шаблон компоновщика, или простую обертку, которая запрещает изменения (например, все неизменяемые коллекции, которые обертывают другую коллекцию и генерируют исключения для мутирующих методов, таких как add).

2

По вопросам рекламы [email protected]