Строковые литералы

При использовании строкового литерала в коде С# компилятор создает объект System. String, который затем помещается во внутреннюю таблицу модуля, именуемого внутренним пулом.

Идея заключается в том, что всякий раз, когда в коде объявляется новый строковый литерал, компилятор сначала проверяет, не объявлен ли он ранее где-нибудь еще, и если это так, то код просто ссылается на уже имеющийся литерал.

Взглянем на пример объявления строкового литерала в С#:

using System;
public class EntryPoint
{
static void Main( string[] args )  {
string litl = "c:\\windows\\system32";
string lit2 = @"c:\windows\system32";
string lit3 = @" Jack and Jill Went up the hill. . .
Console.WriteLine( lit3 );
Console.WriteLine ( "Object.RefEq(litl, lit2) :  {0}",
Object.ReferenceEquals (litl, lit2)  );
if ( args.Length > 0 )  {
Console.WriteLine ( "Полученный параметр:  {0}", args[0]  );
string strNew = String.Intern ( args[0]  );
Console.WriteLine ( "Object.RefEq (litl, strNew):  {0}",
Object.ReferenceEquals(litl, strNew)  );
}

Для начала обратите внимание на объявление двух литеральных строк — litl и lit2. Объявленным типом является string, который в С# представляет собой псевдоним для System.String. Первый экземпляр инициализируется обычным строковым литералом, который может содержать знакомые управляющие последовательности, используемые в С и С++, такие как \t и \п.

Поэтому сам символ обратного слэша должен быть защищен, как обычно, удвоением. Дополнительную информацию о допустимых управляющих последовательностях можно найти в документации MSDN.

Однако С# предлагает особый тип объявления строки, называемый дословными строками (verbatim strings), где все, что находится внутри объявления строки, помещается в нее без изменений.

Такое объявление предваряется символом @, как показано в примере. Следует обратить особое внимание на тот факт, что несколько странное объявление lit3 совершенно корректно.

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

Единственная управляющая последовательность, которая допустима внутри дословных строк — это ” “, и она применяется для вставки в строку символа двойной кавычки.

Ясно, что litl и lit2 содержат строки с одним и тем же значением, даже несмотря на то, что они объявлены по-разному. Учитывая сказанное в предыдущем разделе, можно ожидать, что эти два экземпляра будут ссылаться на один и тот же строковый объект. Фактически так оно и есть, что подтверждает вывод программы, где они проверяются с помощью Object .ReferenceEquals.

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

Код принимает строку из командной строки и затем создает новый экземпляр с применением метода String.Intern. Этот метод всегда возвращает допустимую ссылку на строку, и это будет либо ссылка на экземпляр строки во внутреннем пуле, либо новая копия строки с переданным значением, которая также будет добавлена во внутренний пул.

Если в командной строке передать “с: \windows\system32“, то код выдаст следующий вывод:

Jack and Jill
Went up the hill. . .
Object.RefEq(litl, lit2): True
Полученный параметр: c:\windows\system32
Object.RefEq(litl, strNew): True

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100