НейроАгент

C# String vs string: Полное руководство

Полное руководство по String vs string в C#. Узнайте технические различия, лучшие практики и сценарии, в которых каждый синтаксис предпочтителен в вашем коде.

Вопрос

В чём разница между ‘String’ и ‘string’ в программировании на C#?

Я видел оба этих способа для объявления строковых переменных:

csharp
string s = "Hello world!";
String s = "Hello world!";

В чём ключевые различия между этими двумя подходами, и какой из них следует использовать в моём коде на C#? Есть ли какие-либо последствия для производительности, лучшие практики или сценарии, в которых один из вариантов предпочтительнее другого?

НейроАгент

В C# нет функциональной разницы между String и string - оба обозначают один и тот же тип System.String. Нижний регистр string - это просто языковой псевдоним, предоставляемый C# для класса .NET Framework System.String, в то время как верхний регистр String - это фактическое полное имя класса. Оба варианта компилируются в одинаковый промежуточный язык (IL) и ведут себя абсолютно одинаково во время выполнения.

Содержание

Фундаментальное различие

Основное различие между string и String в C# чисто синтаксическое и концептуальное:

  • string (нижний регистр): Это ключевое слово языка C# и псевдоним для System.String. Оно предоставляется языком C# для повышения читаемости и краткости кода.

  • String (верхний регистр): Это ссылка на фактический класс .NET Framework System.String из пространства имен System.

Как объясняется на Stack Overflow, “String означает System.String и это тип .NET Framework. string - это псевдоним в языке C# для System.String. Оба они компилируются в System.String в IL (промежуточный язык), поэтому разницы нет”.


Техническая реализация

На уровне компилятора оба варианта обрабатываются идентично:

csharp
// Эти два объявления создают идентичный IL-код:
string message = "Hello";
String message = "Hello";

Согласно TutorialTeacher, “String (заглавная S) - это класс в .NET фреймворке в пространстве имен System. Полное имя - System.String. В то время как нижний регистр string - это псевдоним System.String.”

Спецификация языка C# определяет string как встроенный тип, который напрямую сопоставляется с System.String, делая их семантически эквивалентными во всех контекстах.


Рекомендации и правила использования

Хотя оба варианта работают одинаково, сообщество C# выработало четкие рекомендации по лучшим практикам:

Объявления переменных и параметры

Используйте string (нижний регистр) для:

  • Объявлений переменных
  • Параметров методов
  • Типов свойств
  • Локальных переменных
csharp
// Предпочтительный стиль
string userName = "JohnDoe";
public string GetGreeting(string name) { return $"Hello, {name}"; }

Ссылки на классы и статические методы

Используйте String (верхний регистр) когда:

  • Ссылаетесь на сам класс
  • Используете статические методы из класса String
  • Работаете с рефлексией
  • Когда контекст подчеркивает объектно-ориентированный характер
csharp
// При ссылке на методы класса
String.IsNullOrEmpty(inputText);
String.Format("Value: {0}", value);

Как отмечено на Stack Overflow, “когда вы объявляете переменную, лучше использовать ‘string’ (маленькая ‘s’), а когда используете его как имя класса, то предпочтительнее ‘String’ (большая ‘S’)”.

Последовательность в кодовой базе

Сохраняйте последовательность во всем проекте. Выберите один стиль и придерживайтесь его, как рекомендует SourceBae: “Кроме того, рекомендуется придерживаться последовательности в использовании в вашей кодовой базе”.


Вопросы производительности

Разницы в производительности во время выполнения нет

Оба string и String компилируются в идентичный IL-код и имеют абсолютно одинаковые характеристики производительности во время выполнения. Как stated in one Medium article, “Компилятор обрабатывает и String, и string одинаково, что означает, что между ними нет разницы в производительности.”

Неизменяемость строк и производительность

Хотя это не напрямую связано с различием string vs String, стоит отметить, что неизменяемость строк влияет на производительность:

  • Строки в .NET неизменяемы - после создания их нельзя изменить
  • Операции вроде конкатенации создают новые строковые объекты
  • Для повторных манипуляций со строками рассмотрите использование StringBuilder

Как объясняет CodeGuru: “Неэффективная работа со строками является одним из основных узких мест вsofar as производительность приложения concerned.”


Примеры кода

Сравнение базового использования

csharp
// Оба объявления функционально идентичны
string message1 = "Hello World";
String message2 = "Hello World";

// Оба работают абсолютно одинаково
Console.WriteLine(message1.Length);     // Вывод: 11
Console.WriteLine(message2.Length);     // Вывод: 11

// Вызовы методов идентичны
string upper1 = message1.ToUpper();
String upper2 = message2.ToUpper();

Console.WriteLine(upper1);              // Вывод: HELLO WORLD
Console.WriteLine(upper2);              // Вывод: HELLO WORLD

Смешанные шаблоны использования

csharp
public class TextProcessor
{
    // Использование string для параметров (предпочтительно)
    public string ProcessText(string input)
    {
        // Использование String для статических методов
        if (String.IsNullOrEmpty(input))
        {
            return String.Empty;
        }
        
        // Использование string для локальных переменных
        string result = input.Trim();
        result = String.Concat("[", result, "]");
        
        return result;
    }
}

Когда использовать каждый вариант

Рекомендуемые сценарии для string (нижний регистр):

  • Большинство объявлений переменных: Используйте для последовательности с другими примитивными типами C# (int, bool, double)
  • Параметры методов: Следует соглашениям языка C#
  • Объявления свойств: Соответствует стандартам кодирования .NET
  • Общий код разработки: Делает код более читаемым и специфичным для языка

Рекомендуемые сценарии для String (верхний регистр):

  • Вызовы статических методов: String.IsNullOrEmpty(), String.Format()
  • Ограничения универсальных типов: where T : String
  • Сценарии рефлексии: typeof(String)
  • Комментарии к документации: При подчеркивании классовой природы
  • Взаимодействие: При работе с другими языками .NET, которые могут не распознавать псевдоним string

Распространенные заблуждения

Заблуждение: Различия в производительности

Некоторые разработчики считают, что есть разница в производительности, но это неверно. Как отмечено в документации Microsoft Learn, оба варианта компилятором обрабатываются идентично.

Заблуждение: Различия в обработке null

Нет разницы в обработке null между двумя вариантами. Оба могут быть null и оба выбрасывают одинаковые исключения при неправильном использовании.

Заблуждение: Совместимость с фреймворком

Оба варианта работают идентично во всех версиях и фреймворках .NET. Псевдоним string существует в C# с самого его появления.

Как отмечается в одном обсуждении на Reddit, это в первую очередь вопрос стиля и читаемости, а не технических различий.


Заключение

Разница между String и string в C# сводится к синтаксическим предпочтениям, а не к функциональным возможностям. Оба обозначают один и тот же тип System.String и компилируются в одинаковый промежуточный язык. В большинстве сценариев разработки рекомендуется использовать string (нижний регистр) для объявлений переменных и параметров для соблюдения единообразия с соглашениями языка C, в то время как String (верхний регистр) использовать при ссылке на сам класс или вызове статических методов. Самый важный принцип - последовательность в кодовой базе - выберите один стиль и применяйте его единообразно во всем проекте. Помните, что производственные последствия отсутствуют между этими двумя синтаксическими вариациями, поэтому фокусируйтесь на читаемости и поддерживаемости при принятии решения.

Источники

  1. What is the difference between String and string in C#? - Stack Overflow
  2. Difference between string and String in C# - TutorialTeacher
  3. Understanding the Difference Between ‘String’ and ‘string’ in C# - Medium
  4. C# Difference between String and string with Examples - Tutlane
  5. What is the difference between String and string in C#? - SourceBae
  6. Understanding C# String vs String - Medium
  7. Strings - C# | Microsoft Learn