Шаг 93.
Язык программирования C#. Начала
Работа с текстом. Класс String

    На этом шаге мы приведем общие сведения об этом классе.

    Ранее в программах мы объявляли переменные "типа" 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 += "еще один текст";
выполняется следующим образом. Текст "еще один текст" не добавляется в объект, на который ссылается переменная text. Вместо этого создается новый текстовый объект. В него записывается текст, который получается объединением двух текстовых значений: текста из объекта, на который ссылается переменная text, и текста "еще один текст" из правой части команды присваивания. Ссылка на этот новый объект записывается в переменную text.


То есть текст "еще один текст" не дописывается в текущий объект, на который ссылается переменная text, а создается новый текстовый объект с новым значением, и ссылка на этот новый объект записывается в переменную text. В результате создается иллюзия, что к текущему текстовому значению было дописано значение "еще один текст".


Если быть до конца откровенным, то нужно отметить, что способ изменить текстовый объект все же существует. Для этого придется использовать указатели. С их помощью удается "проникнуть" внутрь текстового объекта и добраться до массива, в котором хранятся символы, формирующие текстовое значение. И эти символы можно поменять. Все это мы обсудим, когда будем знакомиться с указателями.

    На следующем шаге мы рассмотрим создание текстового объекта.




Предыдущий шаг Содержание Следующий шаг