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.