Обзор
Во-первых, давайте рассмотрим оба типа:
String
— это обычный идентификатор, который относится к типу данных .NET System.String
. Также необходимо, чтобы был импортирован класс System
.
string
— это зарезервированный дескриптор в C # и дескриптор для .NET System.String
.
Важными словами в этих описаниях являются идентификатор и дескриптор. Идентификатор — это понятное имя, присвоенное типу, который можно переопределить. Дескриптор — это предопределенный фиксированный идентификатор, который имеет особое значение для компилятора.
Поэтому в большинстве случаев разумно ожидать, что обе версии будут ссылаться на global: System.String
, и их можно будет использовать взаимозаменяемо. Доказательство этому можно увидеть в примере фрагмента кода:
public static string string1 = "Created using string";
public static String string2 = "Created using String";
При компиляции на языке-посреднике обе переменные описываются одинаковым способом.
IL_0000: ldstr "Created using string"
IL_0005: stsfld string WorkerSDKOnConsole.Program::string1
IL_000a: ldstr "Created using String"
IL_000f: stsfld string WorkerSDKOnConsole.Program::string2
Примечание: тип string
на языке-посреднике относится к .NET System.String
Рекомендации
Несколько лет назад было рекомендовано использовать дескриптор string
из C# для описания переменных и String
типа .NET для получения доступа к помощникам по string
(например, String.Format (“…”)
). Эта рекомендация по стилю теперь изменена на вариант из C# для всех случаев.
string cheese = “cheddar”;
string petrol = string.Format(“Type: {0}!”, unleaded);
Visual Studio также рекомендует такой вариант как часть правила IDE0049: «Используйте дескрипторы языка вместо дескрипторов среды для ссылки на типы»:
Проблема со String
Почему теперь предпочтение отдается дескрипторам C #?
Поскольку String
не является зарезервированным дескриптором C #, он не имеет гарантированного значения. Это идентификатор, который может относиться к чему угодно, и его значение может варьироваться в зависимости от текущего пространства имен и рекомендаций по использованию. Можно изменить значение String
, просто назвав новую переменную или класс тем же именем. Например, приведенный ниже пример представляет собой полностью допустимый код, в котором String
определяется как целое число:
{
// String - целое
int String = 5;
int output = String + 10; // Valid code
}
{
// String - объект StringBuilder:
var String = new System.Text.StringBuilder();`
}
Поэтому невозможно предположить значение идентификатора String
без полного понимания контекста кодовой базы. У дескриптора string
этой проблемы нет. Попытка переопределить String
таким же образом, как указано выше, попросту не будет компилироваться.
Контраргументы
Конечно, имеется ряд контраргументов, о которых также стоит упомянуть:
- При использовании
String
перенос кода из языка C# в другие языки .NET (например, VB.Net) является более простой задачей - Использование
String
подчеркивает тот факт, что это ссылочный тип (названия ссылочных типов по соглашению указываются в регистре PascalCase) - Некоторые методы библиотеки классов Framework .NET (FCL) ссылаются на названия типов .NET как на часть названия функции (например, ReadInt32)
Выводы
Таким образом, и string
, и String
совершенно допустимы, и в большинстве случаев будут работать одинаково. Решение по использованию также может зависеть от существующих рекомендаций по написанию кода от проекта или команды. Однако в целом рекомендуется по возможности использовать дескриптор string
.
Приложение: типы
Как упоминалось в начале этой статьи, существует множество других типов данных с дополнительными именами, которые можно найти в таблицах ниже.
Встроенные типы значений
Встроенные ссылочные типы
Читайте также:
- Теория вероятностей, или Не стоит полагаться на случай
- Структуры данных, которые необходимо знать каждому программисту
- Оптимизация работы баз данных с PostgreSQL 12
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи TRAPDOOR Labs: C# String vs string — more than just style?