string
против String
это не стиль дебаты
[...]
Ключевое слово string
имеет конкретное значение в C #. Это тип, System.String
который существует в основной сборке времени выполнения. Среда выполнения по-настоящему понимает этот тип и предоставляет возможности, ожидаемые разработчиками для строк в .NET. Его присутствие настолько критично для C #, что, если этот тип не существует, компилятор завершит работу, прежде чем попытаться даже проанализировать строку кода. Следовательно, string
имеет точное, однозначное значение в коде C #.
String
Хотя идентификатор не имеет конкретного значения в C #. Это идентификатор, который проходит через все правила поиска имен, как Widget
и Student
т. Д. Он может связываться со строкой или связываться с типом в другой сборке, цели которого могут полностью отличаться от string
. Хуже того, это может быть определено таким образом, чтобы код был похож String s = "hello"
; продолжил компилировать.
class TricksterString {
void Example() {
String s = "Hello World"; // Okay but probably not what you expect.
}
}
class String {
public static implicit operator String(string s) => null;
}
Фактическое значение String
всегда будет зависеть от разрешения имени. Это означает, что это зависит от всех исходных файлов в проекте и всех типов, определенных во всех ссылочных сборках. Короче говоря, это требует довольно много контекста, чтобы знать того, что это значит, .
Правда, что в подавляющем большинстве случаев String
и string
будут связываться с однотипными. Но использование по- String
прежнему означает, что разработчики оставляют свою программу на интерпретацию в местах, где есть только один правильный ответ. Когда String
происходит привязка к неправильному типу, это может привести к тому, что разработчики будут отлаживать часы в течение нескольких часов, регистрируя ошибки в команде компилятора и вообще тратя время, которое можно было бы сэкономить с помощью string
.
Другой способ визуализировать разницу с этим примером:
string s1 = 42; // Errors 100% of the time
String s2 = 42; // Might error, might not, depends on the code
Многие утверждают, что хотя технически точная информация String
является хорошей, она по-прежнему хороша, потому что крайне редко кодовая база определяет тип этого имени. Или что когдаString
это определено, это признак плохой базы кода.
[...]
Вы увидите , что String
определено для ряда вполне допустимых целей: отражение хелперов, библиотек сериализации, лексеры, протоколы и т.д. ... Для любого из этих библиотек по String
сравнению string
имеет реальные последствия в зависимости от того, где используется код.
Поэтому помните, когда вы видите дебаты String
против string
, речь идет о семантике, а не о стиле. Выбор строки дает четкий смысл вашей кодовой базе. Выбор String
не ошибается, но он оставляет дверь открытой для сюрпризов в будущем.
Примечание: я скопировал / вставил большую часть сообщения в блоге по причине архива. Я игнорирую некоторые части, поэтому я рекомендую пропустить и прочитать сообщение в блоге, если можете.
string
: это лексическая конструкция грамматики C #, тогда какSystem.String
это просто тип. Независимо от каких-либо явных различий, упомянутых в какой-либо спецификации, все еще существует неявное различие, которое можно допустить с некоторой неопределенностью. Сам язык должен поддерживатьstring
таким образом, чтобы реализация (совсем) не была так обязательна для конкретного класса в BCL.