Обзор

Во-первых, давайте рассмотрим оба типа:

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.

Приложение: типы

Как упоминалось в начале этой статьи, существует множество других типов данных с дополнительными именами, которые можно найти в таблицах ниже.

Встроенные типы значений

Встроенные ссылочные типы

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи TRAPDOOR Labs: C# String vs string — more than just style?

Предыдущая статьяКак установить несколько версий Python в WSL2 и управлять ими
Следующая статья10 инструментов, которые упростят жизнь веб-разработчика