Хотя работа со строками довольно хорошо описана в упоминавшейся в предыдущем выпуске рассылке
книге Дж. Рихтера, я решил затронуть эту тему, т.к. не у всех есть возможность прочитать эту
книгу, а неправильное использование строк является частой ошибкой и ведет к снижению
производительности приложения. К тому же, в книге имеется одна небольшая неточность по
работе класса StringBuilder.
В .NET все строки являются экземплярами класса System.String (алиас string в C#).
Он неявно наследуется от System.Object и реализует интерфейсы IComparable, ICloneable,
IConvertible, IEnumerable:
[Serializable]
public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable
C# рассматривает String как примитивный тип, поэтому для инициализации строковой переменной литералом
следует использовать такой синтаксис:
String s = "This is a string.";
Компилятор размещает строковые литералы в метаданных модуля, а доступ к ним в run-time происходит
с использованием так называемого механизма интернирования строк (string interning). Об интернировании
я расскажу в следующей части.
Так работать не будет:
String s = new String("This is a string.");
Т.к. String не имеет конструктора, принимающего String. Конструкторы String позволяют создать экземпляр
из символа (char) или массива символов (char[]). При вызове из C++ with Managed
Extensions или небезопасного кода C# (использующего указатели) применяются конструкторы, принимающие
char* или sbyte*.
C# использует синтаксис С++ для задания специальных символов типа перевода строки или табуляции:
String s = "Line\r\nNew Line";
При выводе, например, с помощью Console.Write(s), "New Line" будет выведено на новой строке.
"\r\n" соответствует константе vbCrLf в Visual Basic 6.0. Но существует более правильный способ
перевода строки. Класс System.Environment содержит read-only свойство NewLine, возвращающее соответствующую
строку, в зависимости от платформы.
String s = "Line" + Environment.NewLine + "New Line";
Например, на платформе UNIX Environment.NewLine вернет \n.
String s = "Column1\tColumn2";
Column1 и Column2 будут разделены табуляцией.
Символ обратной косой черты ("\") является служебным и при использовании внутри строки его необходимо
удваивать:
String path = "c:\\Program Files\\Microsoft Visual Studio 2003\\";
Однако, при помощи символа @ (коммерческое эт) можно определить так называемые "дословные строки" (verbatim
strings). В этом случае компилятор воспринимает обратную косую черту как обычный символ.
Этот код эквивалентен предыдущему:
String path = @"c:\Program Files\Microsoft Visual Studio 2003\";
Продолжение про работу со строками в .NET читайте в следующем выпуске.
Логическая задача
Сначала ответ на задачу из предыдущего выпуска про бильярдные шары.
Имеется 9 совершенно одинаковых с виду бильярдных шаров. Один из шаров тяжелее других.
Необходимо при помощи рычажных весов (т.е. имеющих 2 чаши и показывающих, какая чаша тяжелее или легче)
найти тяжелый шар, используя не более, чем 2 взвешивания.
Ответ. Разделим шары на 3 группы по 3 шара в каждой. На одну чашу положим первую группу, а на другую
- вторую. Если весы находятся в равновесии, то тяжелый шар находится в третьей группе. Иначе - на
перевесившей чаше. Далее, положим на каждую чашу весов по одному шару из "тяжелой группы" (два шара
на весах и один остался). Если весы в равновесии, то тяжелый шар - оставшийся. Иначе - на
перевесившей чаше.
Надеюсь, эта задача не вызвала затруднений. Однако, если заранее неизвестно, тяжелее или легче искомый
шар, задача существенно усложняется. Вот новые условия: Имеется 13 овершенно одинаковых с виду бильярдных шаров, из них ровно один бракованный,
причем неизвестно, легче он остальных или тяжелее. Требуется найти этот шар за три взвешивания.
Весы - стандартные для задач этого типа: две чашечки без гирь.
На сегодня все. Приятного программирования. Да пребудет с вами Великая Сила!
Вопросы? Пожелания? Пишите: olen33@gmail.com