На этом шаге мы приведем общие сведения об этом классе.
Ранее в программах мы объявляли переменные "типа" string и значениями таким переменным присваивали текст. В действительности текстовые значения реализуются как объекты библиотечного класса String из пространства имен System. Идентификатор string, используемый нами для обозначения "текстового типа", в действительности является псевдонимом для инструкции System. String - то есть фактически это название класса String с учетом пространства имен, к которому относится класс.
Как и для всех прочих объектов в языке С#, для работы с объектами класса String используются объектные переменные. Каждый раз, когда мы объявляли переменную типа string, на самом деле мы объявляли объектную переменную класса String. Объекты класса String при этом явно не создавались, хотя они и присутствовали незримо "за кулисами". Например, мы переменным типа string значениями присваивали текстовые литералы (текст, заключенный в двойные кавычки). Внешне это выглядело так, как если бы переменной некоторого "текстового" типа присваивалось текстовое значение. В действительности текстовые литералы реализуются как объекты класса String. Поэтому, когда мы присваиваем текстовый литерал переменной типа string, то объектной переменной класса String присваивается ссылка на объект класса String, через который реализован текстовый литерал. Не очень тривиальным образом выполняются и прочие операции с текстовыми значениями. Мы их проанализируем и посмотрим на ситуацию под несколько иным углом зрения. Но это будет немного позже. Сейчас же мы остановимся на "технических" подробностях, связанных с реализацией объекта класса String.
Как отмечалось выше, при работе с текстом приходится иметь дело с объектной переменной класса String, которая ссылается на объект с текстом. Схематически эта ситуация проиллюстрирована на рисунке 1.
Рис.1. Схема реализации текста
Реальный текст "спрятан" в объекте (откуда он взялся - это вопрос другой).
Особенность текстового объекта в том, что после создания его нельзя изменить (здесь речь идет об объекте, а не об объектной переменной). На первый взгляд, данное утверждение может показаться странным - ведь раньше мы с успехом изменяли текстовые значения, реализованные с помощью переменных типа string. Но противоречия здесь нет. Мы изменяли значение объектной переменной, а не самого объекта. Например, предположим, что в программе объявлена текстовая переменная text:
string text = "текст";
Что происходит в этом случае? Объявляется объектная переменная text, и значением ей присваивается ссылка на объект класса String, в который записано текстовое значение "текст". Текстовая переменная text не содержит значение "текст" - она на него ссылается!
Теперь представим, что выполняется следующая команда:
text += "еще один текст";
Такого типа команды мы всегда интерпретировали как добавление к текущему текстовому значению переменной text текста "еще один текст", указанного справа в выражении. Конечный результат таким и будет: если после выполнения команды мы проверим значение переменной text, то это будет объединение текстовых строк "текст" и "еще один текст". Но достигается данный результат не так просто, как может показаться на первый взгляд.
Мы уже знаем, что сначала переменная text ссылается на текстовый объект с текстом "текст". Команда
text += "еще один текст";
На следующем шаге мы рассмотрим создание текстового объекта.