Почему не делает предложения C# constness сродни C++?

ваш класс customComparator должен реализовать java.util.Comparator для использования. он также должен переопределять compare () AND equals ()

compare () должен ответить на вопрос: Является ли объект 1 меньше, равным или большим, чем объект 2?

full docs: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html

14
задан Frederick The Fool 9 February 2009 в 13:34
поделиться

5 ответов

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

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

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

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

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

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

17
ответ дан 24 October 2019 в 05:06
поделиться

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

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

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

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

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

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

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

6
ответ дан 24 October 2019 в 05:06
поделиться

Вопрос, нам нужен constness в C#?

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

  2. я не уверен, что нам нужны они, так как большинство профессионалов constness является связанной производительностью, Вы заканчиваете в точке 1.

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

0
ответ дан 24 October 2019 в 05:06
поделиться

Я не был бы удивлен, были ли неизменные типы добавлены к будущей версии C#. Уже были перемещения в том направлении с C# 3.0.

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

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

2
ответ дан 24 October 2019 в 05:06
поделиться

г-н Heljsberg , разработчик языка C# уже ответил на этот вопрос:

http://www.artima.com/intv/choicesP.html

5
ответ дан 24 October 2019 в 05:06
поделиться
Другие вопросы по тегам:

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