String и string в С#: больше, чем просто стиль?



Книга String и string в С#: больше, чем просто стиль?

Обзор


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


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.


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


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


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



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





469   0  

Comments

    Ничего не найдено.