Подтвердить что ты не робот

Почему С# не предлагает константу, близкую к С++?

Ссылки на С# очень похожи на ссылки на С++, за исключением того, что они собраны мусором.

Почему так сложно компилятору С# поддерживать следующее:

  • Функции участников помечены const.
  • Ссылки на типы данных (кроме строки), отмеченные const, через которые можно вызывать только функции-члены const?

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

Или уже есть что-то эквивалентное в С#, которое мне не хватает? (Я знаю о ключевых словах readonly и const, но они действительно не соответствуют вышеуказанной цели)

4b9b3361

Ответ 1

Я подозреваю, что есть некоторые практические причины и некоторые теоретические причины:

  • Должна ли константа применяться к объекту или ссылке? Если это в ссылке, должно ли это быть только время компиляции или как часть внутри самой ссылки? Может ли что-то другое, имеющее неконстантную ссылку на тот же объект, скрипку с ним под капотом?
  • Вы хотите, чтобы убрать его, как можете, на С++? Это не очень похоже на то, что вы хотите на управляемой платформе... но как насчет всех тех времен, когда это имеет смысл в С++?
  • Синтаксис становится сложным (IMO), когда у вас есть несколько типов, участвующих в объявлении, - думаю, массивы, дженерики и т.д. Может быть трудно решить, какой именно бит является const.
  • Если вы не можете его отбросить, каждый должен понять это правильно. Другими словами, как типы .NET framework, так и любые другие сторонние библиотеки, которые вы используете, все должны делать правильно, или у вас останутся неприятные ситуации, когда ваш код не может сделать правильные вещи из-за тонкой проблемы с константность.

Там большой вопрос с точки зрения того, почему он не может быть поддержан сейчас, хотя:

  • Обратная совместимость: не все библиотеки будут правильно перенесены на нее, что делает ее практически бесполезной: (

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

РЕДАКТИРОВАТЬ: В течение многих лет в сообществе Java неоднократно высказывался спор. Там довольно много комментариев относительно соответствующей ошибки, которую вы можете найти интересным.

Ответ 2

Как уже сказал Джон (конечно), корректность const не так проста, как может показаться. С++ делает это в одну сторону. D делает это другим (возможно, более правильным/полезным) способом. С# флиртует с ним, но не делает ничего более смелого, как вы обнаружили (и, вероятно, никогда не бывает хорошо, как Джон хорошо освещен снова).

Тем не менее, я считаю, что многие "теоретические причины" Джона разрешены в D-модели.

В D (2.0) const работает так же, как С++, за исключением того, что он полностью транзитивен (поэтому const, примененный к указателю, будет применяться к объекту, на который указывают, любые члены этого объекта, любые указатели, которые имеют объект, объекты, которые они указана на и т.д.), но явно, что это применимо только к переменной, которую вы объявили const (поэтому, если у вас уже есть объект, не являющийся const const, и вы используете указатель const для него, переменная non-const все еще может мутировать состояние).

D вводит другое ключевое слово - инвариант, которое применяется к самому объекту. Это означает, что ничто никогда не может изменить состояние после инициализации.

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

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

Мне бы хотелось увидеть, что порт D запущен на .Net VM, хотя: -)

Ответ 4

Я не удивлюсь, если в будущую версию С# добавятся неизменяемые типы. В этом направлении уже есть шаги с С# 3.0.

Анонимные типы, например, неизменяемы.

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

Ответ 5

Вопрос в том, нужна ли нам константа в С#?

  • Я уверен, что JITTER знает, что данный метод не повлияет на сам объект и автоматически выполняет соответствующие оптимизации. (возможно, испуская call вместо callvirt?)

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

Кроме того, С# имеет ключевое слово readonly.