Основы языка C#. Работа с массивами и строками. Интерфейсы и коллекции
Массивы
Язык C# предоставляет средства для работы с одномерными массивами, массивами массивов и многомерными массивами.
Ниже представлены способы объявления ссылок на массивы различной размерности и конфигурации.
// Объявление массива размерности 3 из элементов типа int. // Фактически это массив составляющих, представляющих собой массивы // размерности 2 одномерных массивов элементов типа int. // Размеры всех составляющих массивов одного уровня равны // между собой ("прямоугольный" массив). int[,,] ar1; // Объявление одномерного массива из // одномерных массивов элементов, каждый из которых является // одномерным массивом элементов типа int. int[][][] ar2; // Объявление одномерного массива составляющих, каждый из которых является // двумерным массивом массивов элементов типа int. // При этом у всех составляющих могут быть разные размеры int[][,] ar3; // Объявление двумерного массива составляющих, каждая из которых является // одномерным массивом элементов типа int. // При этом у всех составляющих могут быть разные размеры. int[,][] ar4;
Рассмотренные примеры демонстрируют определение двух различных категории массивов:
- прямоугольные массивы,
- ломаные (jagged) массивы.
Объявление массива может быть совмещено с инициализацией. При объявлении с отложенной инициализацией сам массив не формируется, а создается только ссылка на массив, имеющая неопределенное значение Null. Поэтому пока массив не будет реально создан и его элементы инициализированы, использовать его нельзя.
Возможны два варианта объявления массива совмещенного с инициализацией.
В первом случае инициализация является явной и задается списком констант, например:
int[] odd = {1, 3, 5, 7, 9};
Во втором случае создание и инициализация массива реализуется вместе с вызовом конструктора массива. Например:
int[] even = new int[5];
Все массивы являются потомками класса System.Array, который в свою очередь наследует ряд интерфейсов: ICloneable, IList, ICollection, IEnumerable, а, следовательно, реализует все их методы и свойства. Кроме того, класс Array имеет большое число собственных методов и свойств.
Благодаря наследованию от класса System.Array, для массивов определены такие встроенные методы копирования, поиска, обращения, сортировки. Массивы можно рассматривать также как как коллекции и использовать цикл foreach для перебора его элементов.
Ниже приведены основные свойства и методы класса System.Array:
Строки
В языке C# определен класс сhar[], и его можно использовать для представления строк постоянной длины. Однако массив сhar[] - это обычный массив, поэтому его нельзя инициализировать строкой символов. В C# не определено преобразование из класса сhar[] в класс String. У String есть динамический метод ToCharArray, задающий подобное преобразование в сhar[].
Объекты класса String объявляются с явной или отложенной инициализацией, с явным или неявным вызовом конструктора класса. Чаще всего, при объявлении строковой переменной конструктор явно не вызывается, а инициализация задается строковой константой. У класса String достаточно много конструкторов, которые позволяют сконструировать строку из:
- символа, повторяющегося указанное число раз;
- массива символов char[] ;
- части массива символов.
Методы класса String позволяют выполнять вставку, удаление, замену, поиск вхождения подстроки в строку. Класс String наследует методы класса Object, а также методы четырех интерфейсов: IComparable, ICloneable, IConvertible, IEnumerable.
Некоторые из членов класса приведены в таблице:
Класс String не разрешает изменять существующие объекты. Для этой цели имеется другой класс - класс StringBuilder, который позволяет исправить данный недостаток. Этот класс принадлежит к изменяемым классам и его можно найти в пространстве имен System.Text.
Объекты этого класса объявляются с явным вызовом конструктора класса. Конструктор класса перегружен, и наряду с конструктором без параметров, создающим пустую строку, имеется набор конструкторов, которым можно передать две группы параметров:
- Первая группа позволяет задать строку или подстроку, значением которой будет инициализироваться создаваемый объект класса StringBuilder.
- Вторая группа параметров позволяет задать размер объекта, т.е объем памяти, отводимой для экземпляру класса StringBuilder.
Примеры конструкторов:
- public StringBuilder(string str, int size). Параметр str задает строку для инициализации, size - размер объекта;
- public StringBuilder(int cursize, int maxsize). Параметры cursize и maxsize задают начальный и максимальный размер объекта;
- public StringBuilder(string str, int start, int len, int size). Параметры str, start, len задают строку инициализации, size - размер объекта.
Над строками этого класса определены (также как идля строк класса String ) операции:
- присваивание ( = );
- две операции проверки эквивалентности ( == ) и ( != );
- взятие индекса ( [] ).
Операция конкатенации ( + ) не определена над строками класса StringBuilder, ее роль играет метод Append, добавляющий новую строку в конец существующей.
Интерфейсы
Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. Однако методы интерфейса объявляются без указания модификатора доступа, и класс, наследующий интерфейс, обязан полностью реализовать все методы интерфейса. В этом - отличие от класса, наследующего абстрактный класс, где потомок может реализовать лишь некоторые методы родительского абстрактного класса, оставаясь абстрактным классом.
Интерфейс позволяет описывать некоторые желательные свойства, которыми могут обладать объекты разных классов.
Среди интерфейсов, встроенных в библиотеку базовых классов .NET, можно особо выделить такие как:
- IEnumerable (для работы с наборами объектов, в т.ч. с использованием оператора foreach ).
- IClonable (копирование объектов).
- IComparable (для сравнения и сортировки объектов).
Пространство имен System.Collections, предназначенное для работы с наборами объектов, поддерживает интерфейсы:
- ICollection (определяет общие характеристики класса набора элементов).
- IComparer, IDictionary (позволяет представлять содержимое объекта в виде пар имя-значение).
- IDictionaryEnumerator (нумерация содержимого объекта, поддерживающего IDictionary).
- IEnumerable, IEnumerator.
- IHashCodeProvider (возвращает хэш-код с помощью выбранного алгоритма хэширования).
- IList (обеспечивает методы добавления, удаления и индексирования элементов в списке объектов).