Mir-knigi.online
Книги онлайн читать бесплатно!
  • Главная
  • Жанры
  • ТОП книг
  • ТОП авторов
  • Контакты

Язык программирования C#9 и платформа .NET5

Часть 62 из 642 Информация о книге

  Console.WriteLine();

}

В то время как приведенные здесь примеры просты и используют те же самые буквы в большинстве культур, если ваше приложение должно принимать во внимание разные наборы культур, тогда применение перечисления

StringComparison
становится обязательным.

Строки неизменяемы

Один из интересных аспектов класса

System.String
связан с тем, что после присваивания объекту string начального значения символьные данные не могут быть изменены. На первый взгляд это может показаться противоречащим действительности, ведь строкам постоянно присваиваются новые значения, а в классе
System.String
доступен набор методов, которые, похоже, только то и делают, что изменяют символьные данные тем или иным образом (скажем, преобразуя их в верхний или нижний регистр). Тем не менее, присмотревшись внимательнее к тому, что происходит "за кулисами", вы заметите, что методы типа
string
на самом деле возвращают новый объект
string
в модифицированном виде:

static void StringsAreImmutable()

{

  Console.WriteLine("=> Immutable Strings:\a");

  // Установить начальное значение для строки.

  string s1 = "This is my string.";

  Console.WriteLine("s1 = {0}", s1);

  // Преобразована ли строка si в верхний регистр?

  string upperString = s1.ToUpper();

  Console.WriteLine("upperString = {0}", upperString);

  // Нет! Строка si осталась в том же виде!

  Console.WriteLine("s1 = {0}", s1);

}

Просмотрев показанный далее вывод, можно убедиться, что в результате вызова метода

ToUpper()
исходный объект
string(s1)
не преобразовывался в верхний регистр. Взамен была возвращена копия переменной типа
string
в измененном формате.

s1 = This is my string.

upperString = THIS IS MY STRING.

s1 = This is my string.

Тот же самый закон неизменяемости строк действует и в случае применения операции присваивания С#. Чтобы проиллюстрировать, реализуем следующий метод

StringsAreImmutable2()
:

static void StringsAreImmutable2()

{

    Console.WriteLine("=> Immutable Strings 2:\a");

  string s2 = "My other string";

  s2 = "New string value";

}

Скомпилируйте приложение и запустите

ildasm.exe
(см. главу 1). Ниже приведен код CIL, который будет сгенерирован для метода
StringsAreImmutable2()
:

.method private hidebysig static void  StringsAreImmutable2() cil managed

{

  // Code size       21 (0x15)

  .maxstack  1

  .locals init (string V_0)

  IL_0000:  nop

  IL_0001:  ldstr      "My other string"

  IL_0006:  stloc.0

  IL_0007:  ldstr      "New string value" /* 70000B3B */

  IL_000c:  stloc.0

  IL_000d:  ldloc.0

  IL_0013:  nop

  IL_0014:  ret

} // end of method Program::StringsAreImmutable2

Хотя низкоуровневые детали языка CIL пока подробно не рассматривались, обратите внимание на многочисленные вызовы кода операции

ldstr
("load string" — "загрузить строку"). Попросту говоря, код операции
ldstr
языка CIL загружает новый объект
string
в управляемую кучу. Предыдущий объект
string
, который содержал значение
"Му other string"
, будет со временем удален сборщиком мусора.

Так что же в точности из всего этого следует? Выражаясь кратко, класс

string
может стать неэффективным и при неправильном употреблении приводить к "разбуханию" кода, особенно при выполнении конкатенации строк или при работе с большими объемами текстовых данных. Но если необходимо представлять элементарные символьные данные, такие как номер карточки социального страхования, имя и фамилия или простые фрагменты текста, используемые внутри приложения, тогда тип
string
будет идеальным вариантом.

Однако когда строится приложение, в котором текстовые данные будут часто изменяться (подобное текстовому процессору), то представление обрабатываемых текстовых данных с применением объектов

string
будет неудачным решением, т.к. оно практически наверняка (и часто косвенно) приведет к созданию излишних копий строковых данных. Тогда каким образом должен поступить программист? Ответ на этот вопрос вы найдете ниже.

Использование типа System.Text.StringBuilder

С учетом того, что тип

string
может оказаться неэффективным при необдуманном использовании, библиотеки базовых классов .NET Core предоставляют пространство имен
System.Text
. Внутри этого (относительно небольшого) пространства имен находится класс
StringBuilder
. Как и
System.String
, класс
StringBuilder
определяет методы, которые позволяют, например, заменять или форматировать сегменты. Для применения класса
StringBuilder
в файлах кода C# первым делом понадобится импортировать следующее пространство имен в файл кода (что в случае нового проекта Visual Studio уже должно быть сделано):


Перейти к странице:
Предыдущая страница
Следующая страница
Жанры
  • Военное дело
  • Деловая литература
  • Детективы и триллеры
  • Детские
  • Детские книги
  • Документальная литература
  • Дом и дача
  • Дом и Семья
  • Жанр не определен
  • Зарубежная литература
  • Знания и навыки
  • История
  • Компьютеры и Интернет
  • Легкое чтение
  • Любовные романы
  • Научно-образовательная
  • Образование
  • Поэзия и драматургия
  • Приключения
  • Проза
  • Прочее
  • Психология и мотивация
  • Публицистика и периодические издания
  • Религия и духовность
  • Родителям
  • Серьезное чтение
  • Спорт, здоровье и красота
  • Справочная литература
  • Старинная литература
  • Техника
  • Фантастика и фентези
  • Фольклор
  • Хобби и досуг
  • Юмор
Mir-knigi.online

Бесплатная онлайн библиотека для чтения книг без регистрации с телефона или компьютера. У нас собраны последние новинки, мировые бестселлеры книжного мира.

Контакты
  • [email protected]
Информация
  • Карта сайта
© mir-knigi.online, 2026. | Вход