Работа со строками при помощи класса string
Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом С#. Ему соответствует базовый класс System.Stгingбиблиотеки .NET.
Создать строку можно несколькими способами:
· string s; // инициализация отложена
· string s = "stroka"; // инициализация строковым литералом
· string s= new string(‘ ‘, 20); / / конструктор создает строку из 20 пробелов
· char[] а ={ '1' , '2' , '3' }; // массив для инициализации строки
string s = new string( a ); // создание из массива символов.
Для строк определены следующие операции:
· присваивание (=);
· проверка на равенство (==);
· проверка на неравенство (!=);
· обращение по индексу ([]);
· сцепление (конкатенация) строк (+).
Несмотря на то что строки являются ссылочным типом данных, на равенство и неравенство проверяются не ссылки, а значения строк. Строки равны, если имеют одинаковое количество символов и совпадают посимвольно.
Обращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения. Это связано с тем, что строки типа string относятся к так называемым неизменяемым типам данных*. Методы, изменяющие содержимое строки, на самом деле создают новую копию строки. Неиспользуемые «старые» копии автоматически удаляются сборщиком мусора. В классе System.String предусмотрено множество методов, полей и свойств, позволяющих выполнять со строками практически любые действия. Примеры:
· Compare (статический метод) – сравнение двух строк в алфавитном порядке.
· Concat (статический метод) – конкатенация строк ( сцепление произвольного количества строк).
· IndexOf(метод)–определение индексов вхождения подстроки в строку.
· Length(свойство) – длина строки (количество символов).
· Copy(статический метод) – создание копии строки.
Пример легко написать самостоятельно.
*** форматирование строк
Console.WriteLine( “ a = {0 , 6: C} b = {1 , 2 : X} ”, a, b ); // 1
В операторе 1 неявно применяется метод Format, который заменяет
все вхождения параметров в фигурных скобках значениями соответствующих переменных из списка вывода. После номера параметра можно задать минимальную ширину поля вывода, а также указать спецификатор формата, который определяет форму представления выводимого значения. В общем виде параметр задается следующим образом:
{n [, m [:спецификатор_формата [число] ] }
Здесь n — номер параметра. Параметры нумеруются с нуля, нулевой параметр заменяется значением первой переменной из списка вывода, первый параметр — второй переменной и т. д. Параметр m определяет минимальную ширину поля, которое отводится под выводимое значение. Если выводимому числу достаточно меньшего количества позиций, неиспользуемые позиции заполняются пробелами.
Если числу требуется больше позиций, параметр игнорируется.
Спецификатор формата, как явствует из его названия, определяет формат вывода значения. Например, спецификатор С (Currency) означает, что параметр должен форматироваться как валюта с учетом национальных особенностей представления, а спецификатор X (Hexadecimal) задает шестнадцатеричную форму представления
выводимого значения. После некоторых спецификаторов можно задать количество позиций, отводимых под дробную часть выводимого значения.
Примеры применения пользовательских шаблонов форматирования
Число Шаблон Вид
1,243 00.00 01,24
1,243 #.## 1,24
0,1 00.00 00,10
0,1 #.## ,1
Пользовательский шаблон может также содержать текст, который в общем случае
заключается в апострофы.
Поляиметодыкласса. Модификаторыдоступаpublic, privateиprotected
Поля и методы класса
Данные, содержащиеся в классе, могут быть переменными или константами. Переменные, описанные в классе, называются полями класса.
При описании элементов класса можно также указывать атрибуты и спецификаторы, задающие различные характеристики элементов. Синтаксис описания элементаданных приведен ниже:
[ атрибуты ] [ спецификаторы ] [ const ] тип имя [ = начальное_значение ]
· new Новое описание поля, скрывающее унаследованный элемент класса.
· publiс Доступ к элементу не ограничен.
· protected Доступ только из данного и производных классов.
· internal Доступ только из данной сборки.
· protectedinternalДоступ только из данного и производных классов и из данной сборки.
· privateДоступ только из данного класса
· staticОдно поле для всех экземпляров класса
· readonlyПоле доступно только для чтения
Обращение к полю класса выполняется с помощью операции доступа (точка). Справа от точки задается имя поля, слева — имя экземпляра для обычных полейили имя класса для статических.
MyClass.a = 15;
Все поля сначала автоматически инициализируются нулем соответствующего типа (например, полям типа int присваивается 0, а ссылкам на объекты — значение null). После этого полю присваивается значение, заданное при его явной инициализации. Задание начальных значений для статических полей выполняется при инициализации класса, а обычных — при создании экземпляра.
Поля со спецификатором readonly предназначены только для чтения. Установить значение такого поля можно либо при его описании, либо в конструкторе.
Методы
Метод — это функциональный элемент класса, который реализует вычисления или другие действия, выполняемые классом или экземпляром. Методы определяютповедение класса.
Метод представляет собой законченный фрагмент кода, к которому можно обратиться по имени. Он описывается один раз, а Вызываться может столько раз, сколько необходимо. Один и тот же метод может обрабатывать различные данные,переданные ему в качестве аргументов.
Синтаксис метода:
[ атрибуты ] [ спецификаторы ] тип имя метода ( [ параметры ] )
тело_метода
Рассмотрим основные элементы описания метода. Первая строка представляет собой заголовок метода. Тело метода, задающее действия, выполняемые методом,чаще всего представляет собой блок — последовательность операторов в фигурных скобках.
При описании методов можно использовать спецификаторы имеющие тот же смысл, что и для полей, а также спецификаторы virtual, sealed, override, abstract и extern, которые будут рассмотрены по мер необходимости.
Чаще всего для методов задается спецификатор доступа public, ведь методы составляют интерфейс класса — то, с чем работает пользователь, поэтому онидолжны быть доступны.
Статические (static) методы, или методы класса, можно вызывать, не создавая экземпляр объекта.
publicint GetHello()
{
return“Hello World! ”;
}
Тип определяет, значение какого типа вычисляется с помощью метода. Часто употребляется термин «метод возвращает значение», поскольку после выполнения метода происходит возврат в то место вызывающей функции, откуда был вызван метод, и передача туда значения выражения, записанного в операторе return. Если метод имеет тип void, то он не возвращает никакого значения, оператор returnотсутствует.
Параметры используются для обмена информацией с методом. Параметр представляет собой локальную переменную, которая при вызове метода принимает значение соответствующего аргумента. Область действия параметра — весь метод.
Параметры, описываемые в заголовке метода, определяют множество значений аргументов, которые можно передавать в метод. Список аргументов при вызовекак бы накладывается на список параметров, поэтому они должны попарносоответствовать друг другу. Правила соответствия подробно рассматриваются в следующих разделах.
Для каждого параметра должны задаваться его тип и имя. Например, заголовок метода Sin выглядит следующим образом:
public static double Sin( double a );
Имя метода вкупе с количеством, типами и спецификаторами его параметров представляет собой сигнатуру метода — то, по чему один метод отличают отдругих. В классе не должно быть методов с одинаковыми сигнатурами.
Метод, описанный со спецификатором static, должен обращаться только к статическим полям класса. Обратите внимание на то, что статический методвызывается через имя класса, а обычный— через имя экземпляра.
В С# для обмена данными между вызывающей и вызываемой функциями предусмотрено
четыре типа параметров:
• параметры-значения;
• параметры-ссылки — описываются с-помошью ключевого слова ref;
• выходные параметры — описываются с помощью ключевого слова out;
• параметры-массивы — описываются с помощью ключевого слова params.
Параметр-значение описывается в заголовке метода следующим образом:
Тип имя
Пример заголовка метода, имеющего один параметр-значение целого типа:
VoidP( intx )
Таким образом, для параметров- значений используется, как вц догадались, передача по значению. Ясно, что этот способ годится только для величин, которые не должны измениться после выполнения метода, то есть для его исходных данных.
Признаком параметра-ссылки является ключевое слово ref перед описанием параметра:
Refтипимя
Метод работает непосредственно с переменнойиз вызывающей функции и, следовательно, может ее изменить, поэтому еслив методе требуется изменить значения параметров, они должны передаватьсятолько по ссылке.
В этом случае становится неудобным ограничение параметров-ссылок: необходимость присваивания значения аргументу до вызова метода. Этоограничение снимает спецификатор out. Параметру, имеющему этот спецификатор, должно быть обязательно присвоено значение внутри метода, компиляторза этим следит. Зато в вызывающем коде можно ограничиться описанием переменнойбез инициализации.