Чтение онлайн

ЖАНРЫ

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

if (firstString.ToUpper == secondString.ToUpper)

{

// Делать что-то

}

Здесь создается копия каждой строки со всеми символами верхнего регистра. В большинстве ситуаций это не проблема, но в случае очень крупных строк может пострадать производительность. И дело даже не производительности — написание каждый раз такого кода преобразования становится утомительным. А что, если вы забудете вызвать

ToUpper
? Результатом будет трудная в обнаружении ошибка.

Гораздо лучший

прием предусматривает применение перегруженных версий перечисленных ранее методов, которые принимают значение перечисления
StringComparison
, управляющего выполнением сравнения. Значения
StringComparison
описаны в табл. 3.7.

Чтобы взглянуть на результаты применения

StringComparison
, создайте новый метод по имени
StringEqualitySpecifyingCompareRules
со следующим кодом:

static void StringEqualitySpecifyingCompareRules

{

Console.WriteLine("=> String equality (Case Insensitive:");

string s1 = "Hello!";

string s2 = "HELLO!";

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

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

Console.WriteLine;

// Проверить результаты изменения стандартных правил сравнения.

Console.WriteLine("Default rules: s1={0},s2={1}s1.Equals(s2): {2}",

s1, s2,
s1.Equals(s2));

Console.WriteLine("Ignore case: s1.Equals(s2,

StringComparison.OrdinalIgnoreCase): {0}",

s1.Equals(s2, StringComparison.OrdinalIgnoreCase));

Console.WriteLine("Ignore case, Invariant Culture: s1.Equals(s2,

StringComparison.
InvariantCultureIgnoreCase): {0}",

s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase));

Console.WriteLine;

Console.WriteLine("Default rules: s1={0},s2={1} s1.IndexOf(\"E\"): {2}",

s1, s2,
s1.IndexOf("E"));

Console.WriteLine("Ignore case: s1.IndexOf(\"E\",

StringComparison.OrdinalIgnoreCase):

{0}", s1.IndexOf("E",

StringComparison.OrdinalIgnoreCase));

Console.WriteLine("Ignore case, Invariant Culture: s1.IndexOf(\"E\",

StringComparison.
InvariantCultureIgnoreCase): {0}",

s1.IndexOf("E", StringComparison.InvariantCultureIgnoreCase));

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

Поделиться с друзьями: