Этот ответ существует для исторических целей.
При проверке этого ответа было разработано множество полезных диалогов, и вместо того, чтобы удалять его, этот контент воспроизводится напрямую:
В .NET (в отличие от Java) строка и строка в точности совпадают. И да, вы можете иметь строковые литеральные константы в .NET - DrJokepu 3 февраля 2009 г. в 16: 57
Вы говорите, что у класса не может быть констант? - StingyJack, 3 февраля 2009 г., 16: 58
Да, объекты должны использоваться только для чтения. Только структуры могут делать константы. Я думаю, что когда вы используете string
вместо String
, компилятор превращает const в readonly для вас. Все, что нужно сделать, чтобы программисты на C были довольны. - Гарри Шатлер 3 февраля 2009 года в 16: 59
tvanfosson только что объяснил это немного более многословно. «X не может быть константой, потому что содержащий Y является классом» было слишком мало контекстно-зависимым;) - Леонидас 3 февраля 2009 г. в 17: 01
string.Empty - это статическое свойство, которое возвращает экземпляр класса String, а именно пустую строку, а не сам класс строки. - tvanfosson 3 февраля 2009 г. в 17:00
Empty - это доступный только для чтения экземпляр (это не свойство) класса String. - Senfo 3 февраля 2009 г., 17: 02
Голова болит. Я все еще думаю, что я прав, но теперь я менее уверен. Исследование требуется сегодня вечером! - Гарри Шатлер 3 февраля 2009 года в 17: 07
Пустая строка является экземпляром класса string. Пустое - это статическое поле (я не исправляю это свойство) в классе String. В основном разница между указателем и тем, на что он указывает. Если бы это было не только для чтения, мы могли бы изменить, к какому экземпляру относится поле Empty. - tvanfosson 3 февраля 2009 года в 17: 07
Гарри, тебе не нужно проводить никаких исследований. Думаю об этом. Строка это класс. Пустой является экземпляром строки. - Senfo 3 февраля 2009 г., 17: 12
Есть кое-что, чего я не совсем понимаю: как статический конструктор класса String может создать экземпляр класса String? Разве это не какой-то сценарий "курица или яйцо"? - DrJokepu 3 февраля 2009 года в 17:12
5
Этот ответ будет правильным для почти любого другого класса, кроме System.String. В .NET много специальных возможностей для обработки строк, и одна из них заключается в том, что вы МОЖЕТЕ иметь строковые константы, просто попробуйте. В этом случае Джефф Йейтс имеет правильный ответ. - Джоэл Мюллер 3 февраля 2009 года в 19: 25
Как описано в §7.18, константное выражение - это выражение, которое может быть полностью оценено во время компиляции. Поскольку единственный способ создать ненулевое значение ссылочного типа, отличного от строки, это применить оператор new, а поскольку новый оператор не разрешен в выражении константы, единственно возможное значение для констант ссылочных типов кроме строки ноль. Предыдущие два комментария были взяты непосредственно из спецификации языка C # и повторяют то, что упоминал Джоэл Мюллер. - Senfo 4 февраля 2009 в 15:05
5