
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky
.pdfКонтрольные вопросы
Являются ли типы массивов типами значений?
Какое значение имеет индексирующее выражение при обращении к первому элементу одномерного массива?
Какой тип может иметь индексирующее выражение? Где размещается (в стоке или в куче) ссылка на массив?
При выполнении какой операции создаётся объект класса массивов? Что такое класс массивов?
Какие значения принимают элементы массива при отсутствии в его определении инициализатора?
Какова структура инициализатора массива?
Чем определяется количество инициализирующих выражений в инициализаторе массива?
Объясните назначение всех элементов цикла foreach. Каково назначение и возможности переменной цикла foreach.
Можно ли изменить размер массива-объекта после его создания?
Можно ли изменить размер массива-объекта в процессе выполнения программы? Назовите свойства массивов, унаследованные ими от класса Array.
Приведите примеры нестатических методов одномерных массивов. Приведите примеры статических методов одномерных массивов.
Вчём различия методов Copy() и Clone()? Что такое размерность массива?
Что такое спецификатор размерности массива?
Допустимо ли динамическое определение размеров многомерных массивов? Чему равно свойство Length для многомерного массива?
С помощью каких средств можно получить размер многомерного массива по нужному измерению?
Сколько спецификаторов размерности в объявлении типа четырёхмерного массива?
Перечислите синтаксические отличия массива/массивов от двумерного массива. Сколько операций new в определении объекта трёхмерного массива?
Чему равно свойство Rank массива массивов?
Вкаком случае при клонировании массива проявляется эффект поверхностного копирования?
Глава 8. Строки – объекты класса string
8.1. Строковые литералы
Для представления текстовой информации в C# используются объекты класса string. Класс string "класс: string" представляет собой один из предопределённых типов языка C#. В .Net Framework этому типу соответствует класс System.String.
Один из видов объектов класса string мы уже многократно применяли – это строковые константы или строковые литералы.
Строковая константа или строковый литерал имеет две формы – обычный
(регулярный) строковый литерал (regular-string-literal) и буквальный строковый литерал "литерал:строковый литерал" (verbatim-string-literal). До сих пор мы использовали только обычную ( регулярную) форму, традиционную для языков программирования. Регулярный строковый литерал – это последовательность символов и эскейп-последовательностей, заключенная в кавычки (не в апострофы).
В регулярных строковых константах для представления специальных символов используются те же эскейп-последовательности, которые применяются в константах типа c h a r . Обрабатывая регулярный строковый литерал
"литерал:регулярный строковый литерал" , компилятор из его символов формирует строковый объект и при этом заменяет эскейп-последовательности соответствующими кодами (символов или управляющих кодов). Таким образом,
литералу
"\u004F\x4E\u0045\ttwo"
будет соответствовать строка, при выводе которой на экране текст появится в
таком виде:
ONE two
Здесь \u004F – юникод символа `О`, \x4E – шестнадцатеричный код символа
`N`, \u0045 – юникод символа `E`, \t - эскейп-последовательность, представляющая
код табуляции.
Буквальный строковый литерал начинается с префикса @, за которым в
кавычках размещается возможно пустая последовательность символов. Символы
такого литерала воспринимаются буквально, то есть в такой строке |
не |
|
обрабатываются эскейп-последовательности |
"эскейп-последовательность" , а |
|
каждый символ воспринимается как таковой. |
|
|
В результате выполнения оператора: |
|
|
Console.WriteLine(@"\u004F\x4E\u0045\ttwo");
на экране появится
\u004F\x4E\u0045\ttwo
Если в буквальном литерале необходимо поместить кавычку, то она изображается двумя рядом стоящими кавычками.
Важно отметить, что буквальный литерал может быть размещён в коде программы на нескольких строках и это размещение сохраняется при его выводе. В
тоже время попытка перехода на новую строку с помощью эскейп-
последовательности \n в буквальном литерале будет безуспешной.
8.2. Строковые объекты и ссылки типа string
Каждый строковый литерал — это объект класса string. Класс string является
типом ссылок. Кроме литералов можно определить объекты класса |
string с |
использованием конструкторов. (Конструктор "конструктор" |
– специальный |
метод класса, предназначенный для инициализации объекта класса в процессе его создания.) Конструкторы класса string позволяют инициализировать объекты-
строки несколькими способами.
Наиболее простая форма создания строки-объекта – применение строкового литерала в качестве инициализирующего выражения
"выражение:инициализирующее выражение" . Пример:
string line1="Это строка 1";
После выполнения этого объявления создаётся ссылка line1 типа string, и она ассоциируется со строковым литералом, который является объектом класса string.
Строковый объект можно создавать, используя массив символов:
char [ ] car ={'M', 'a', 'c', 'c', 'u', 'в'};
string line2 = new string (car);
В данном примере определён символьный массив. Представляющая его ссылка car используется в качестве аргумента при обращении к конструктору класса string.
Значением создаваемого объекта будет строка "Массив". Чтобы получить строку,
содержащую один символ, используется конструктор с первым параметром типа char и вторым параметром, равным 1.
Пример: string line3 = new string (‘W’,1); line3 представляет строку "W".
Если нужна строка, содержащая последовательность одинаковых символов, то применяется конструктор с двумя параметрами. Первый из них определяет нужный символ, а второй – число его повторений.
Пример: string line4 = new string ('7',3);
В данном случае line4 это ссылка на строку "777".
Второй параметр может быть любым целочисленным выражением, поэтому этот конструктор удобно применять в тех случаях, когда количество повторений символа заранее неизвестно, то есть зависит от каких-то изменяемых при выполнении программы данных.
Обратите внимание, что среди конструкторов класса string нет конструктора с параметром типа string.
Строковые объекты, как создаваемые с применением конструкторов, так и формируемые для представления строковых литералов, компилятор размещает в куче. Ссылки на строки размещаются в стеке. Размер строки при определении строкового объекта явно не указывается, он определяется автоматически при инициализации. Ни размер строки, ни её содержимое не могут изменяться после
создания строки!!!
Если инициализация при объявлении строковой ссылки отсутствует, то ей присваивается значение null, и ее нельзя использовать в выражениях до присваивания ей конкретного значения. Пример ошибки:
string line;
line += "asdfg"; // ошибка компиляции
Кроме явного задания строковых литералов и применения конструкторов для создания строковых объектов используют метод ToString() "метод: ToString()" .
Этот метод определён для всех встроенных типов. Например, значением выражения
242.ToString()
будет строковый объект, содержащий изображение символов целого числа "242".
После выполнения операторов bool b = 5>4;
strng sb = b.ToString();
значением sb будет строка "True"
8.3. Операции над строками
Строки языка C# предназначены для хранения последовательностей символов,
для каждого из которых отводится 2 байта, и они хранятся в кодировке Unicode (как данные типа char). В некотором смысле строка подобна одномерному массиву с элементами типа char. Элементы (символы строки) последовательно нумеруются,
начиная с 0. Последний символ имеет номер на 1 меньше длины строки.
Для строковых объектов определена операция индексирования
"операции:операция индексирования" :
строка[индексирующее_выражение]
строка – это ссылка на объект класса string или строковая константа;
индексирующее_выражение – должно быть целочисленным и не может быть
меньше нуля.

Результат выражения с операцией индексирования – символ (значение типа char), размещённый в той позиции строки, номер которой соответствует индексному выражению. Если значение индекса меньше нуля, а также больше или равно длине строки, возникает исключительная ситуация (генерируется исключение).
Выражение "выражение: праводопустимое" с операцией индексирования,
применённое к строке, только праводопустимое. С его помощью запрещено
(невозможно) изменить соответствующий элемент строки.
В качестве примера рассмотрим выражение, формирующее символьное представление шестнадцатеричной цифры по её десятичному значению в диапазоне от 0 до 15:
"0123456789ABCDEF"[ind]
Если ind ==13, то значением выражения будет 'D'.
Операция присваивания (=) для строк "операции: присваивания (=) для строк" выполняется не так как, например, для массивов. Когда ссылке с типом массива присваивается значения ссылки на другой уже существующий массив,
изменяет только значение ссылки. Массив, как объект, становится доступен для нескольких ссылок.
Операция присваивания для строк приводит к созданию нового экземпляра той строки, на которую ссылается выражение справа от знака операции =. Ранее существовавшая строка никак не ассоциируется с новой ссылкой.
Сказанное иллюстрирует рис. 8.1, на котором приведена схема,
соответствующая следующим объявлениям: char [ ] aCh = {'Б','и','т'};
char[ ] bCh = aCh;
string aSt = "Байт"; string bSt = aSt;
стек |
Б |
и |
куча |
aCh |
т |

bCh |
|
|
|
|
aSt |
Б |
а |
й |
т |
bSt |
Б |
а |
й |
т |
Рис. 8.1. Присваивания для ссылок на массивы и строки
Рис. 8.1. Присваивания для ссылок на массивы и на строки
Операции сравнения на равенство "операция: сравнения на равенство" == и
неравенство !=, применяемые к строкам, сравнивают последовательности символов
в строках. (Отметим, что для массивов сравниваются значения ссылок.)
Значением выражения aSt==bSt будет true.
Конкатенацию строк "конкатенация:конкатенация строк" выполняет операция +. Например, после приведённого определения ссылки aSt выражение
aSt+" состоит из 8 бит"
приведёт к формированию строки "Байт состоит из 8 бит". Операция + перегружена и обеспечивает конкатенацию не только двух строк, а также строки и операнда
другого типа, значение которого автоматически приводится к типу |
string. |
Например, выражение |
|
aSt+" содержит "+8+" бит" |
|
формирует строку "Байт содержит 8 бит". |
|
Однако значением выражения |
|
aSt+" содержит "+8+aCh |
|
будет строка "Байт содержит 8 System.Char[ ]". |
|
В этом случае ссылка на массив aCh приводится к обозначению типа |
|
символьного массива. (Значением выражения aCh.ToString( ) является
“System.Char[ ]”.)
Операция + как конкатенация имеет тот же ранг, что и операция +,
обозначающая сложение арифметических данных. Поэтому значением выражения aSt+" содержит "+4+4+" бит"
будет строка "Байт содержит 44 бит".
По-видимому, это не то, что ожидали. Но ведь операции одного ранга выполняются слева направо.
8.4. Некоторые методы и свойства класса String
Хотя мы ещё не рассматривали механизм и синтаксис наследования, и не
умеем конструировать производные классы, но уже сейчас полезно отметить, что класс string есть sealed-класс, то есть он не может служить базовым для других
производных классов. |
|
|
|
|
Наиболее важным свойством класса |
string является свойство |
Length |
||
"свойство: Length" |
, позволяющее получить длину (количество символов) |
|||
конкретной строки |
(объекта класса |
string). Значением выражения |
“\tБином |
\u0068”.Length будет 7, так как каждая эскейп-последовательность представляет только один символ.
Среди многочисленных методов класса string рассмотрим (и то очень кратко)
только некоторые.
int CompareTo( ) – нестатический метод который сравнивает две строки и возвращает целочисленное значение. Для двух строк S1, S2 значение
S1CompareTo(S2) равно +1, если S1>S2, и равно -1, если S1<S2 и равно нулю, если
S1==S2. Сравнение строк выполняется лексикографически.
static string Concat() – статический метод (их несколько) выполняет конкатенацию "конкатенация" строк-параметров. Аргументов-строк может быть
два, три или произвольное количество.
static string Copy() – статический метод возвращает копию существующей
строки.
static string Format() – статический метод, формирующий строку на основе набора параметров. Этот метод подробно рассматривается в §8.5.
int IndexOf() – нестатический метод поиска в вызывающей строке подстроки,
заданной параметром. Возвращает индекс или -1, если поиск неудачен. Поиск с
начала строки.
string Insert() – нестатический метод для вставки строки-параметра в копию вызывающей строки с позиции, заданной дополнительным параметром.
static string Join() – статический метод, объединяющий в одну строку строки массива–параметра. Первый параметр типа string задаёт разделитель, которым будут отделены друг от друга в результирующей строке элементы массива.
int LastIndexOf() – нестатический метод поиска в вызывающей строке подстроки, заданной параметром. Возвращает индекс или -1, если поиск неудачен.
Поиск с конца строки.
string Remove() – нестатический метод, удаляет символы из копии строки. string Replace() – нестатический метод, заменяет символы в копии строки. string [ ] Split() – нестатический метод, формирует массив строк из фрагментов вызывающей строки. Параметр типа char[ ] задаёт разделители,
которыми в строке разделены фрагменты.
char [ ] ToCharArray() – нестатический метод, копирует символы вызывающей
строки в массив типа char[ ].
string Trim( ) – нестатический метод, удаляет вхождение заданных символов
(например, пробела) в начале и в конце строки.
string Substring( ) – нестатический метод, выделяет из строки подстроку.
Параметры задают начало и длину выделяемой части строки.
8.5. Форматирование строк
При выводе, например, с помощью Console.Write() значений базовых типов
(например, int или double) они автоматически преобразуются в символьные строки. Если программиста не устраивает автоматически выбранный формат их внешнего представления, он может его изменить. Для этого можно воспользоваться статическим методом Format "метод: Format" класса string или использовать так называемую строку форматирования "строка форматирования" в качестве первого параметра методов, поддерживающих форматирование, например, Console.Write() и Console.WriteLine(). В обоих случаях правила подготовки исходных данных для получения желаемого результата (новой строки) одинаковы. Рассмотрим эти правила применительно к методу класса string:
public static string Format(string form, params object[ ] ar).
Так как синтаксис заголовков методов (функций) мы формально ещё не рассматривали, поясним элементы приведённого заголовка.
public – модификатор доступа. Указывает что метод открытый, т.е. доступен
вне класса string.
static – модификатор, относящий метод к классу в целом, а не к его объектам. string – тип возвращаемого методом значения
Format – имя метода.
form – параметр, представляющий строку форматирования.
params – модификатор, указывающий, что следующий за ним массив-
параметр ar может быть заменён при обращении к функции любым количеством аргументов (включая нуль, т.е. аргументы могут отсутствовать).
object – тип элементов массива-параметра ar. Так как object – это базовый класс для всех типов языка C#, то аргументы, соответствующие элементам массива object[ ] ar, могут иметь любой тип.
Итак, метод string.Format() возвращает строку, построенную на основе строки форматирования и значений аргументов, следующих за этой строкой в обращении к методу Format( ).