- •1. Лекция: Visual Studio .Net, Framework .Net
- •Visual Studio .Net - открытая среда разработки
- •Открытость
- •Framework .Net - единый каркас среды разработки
- •Библиотека классов FCL - статический компонент каркаса
- •Единство каркаса
- •Встроенные примитивные типы
- •Структурные типы
- •Архитектура приложений
- •Модульность
- •Общеязыковая исполнительная среда CLR - динамический компонент каркаса
- •Двухэтапная компиляция. Управляемый модуль и управляемый код
- •Виртуальная машина
- •Дизассемблер и ассемблер
- •Метаданные
- •Сборщик мусора - Garbage Collector - и управление памятью
- •Исключительные ситуации
- •События
- •Общие спецификации и совместимые модули
- •2. Лекция: Язык C# и первые проекты
- •Создание C#
- •Виды проектов
- •Консольный проект
- •Windows-проект
- •Начало начал - точка "большого взрыва"
- •Выполнение проекта по умолчанию после "большого взрыва"
- •Проект WindowsHello
- •3. Лекция: Система типов языка С#
- •Общий взгляд
- •Система типов
- •Типы или классы? И типы, и классы
- •Семантика присваивания
- •Преобразование к типу object
- •Примеры преобразований
- •Семантика присваивания. Преобразования между ссылочными и значимыми типами
- •Операции "упаковать" и "распаковать" (boxing и unboxing).
- •4. Лекция: Преобразования типов
- •Где, как и когда выполняются преобразования типов?
- •Преобразования ссылочных типов
- •Преобразования типов в выражениях
- •Преобразования внутри арифметического типа
- •Явные преобразования
- •Преобразования строкового типа
- •Преобразования и класс Convert
- •Проверяемые преобразования
- •Исключения и охраняемые блоки. Первое знакомство
- •Опасные вычисления в охраняемых проверяемых блоках
- •Опасные вычисления в охраняемых непроверяемых блоках
- •Опасные преобразования и методы класса Convert
- •5. Лекция: Переменные и выражения
- •Объявление переменных
- •Проект Variables
- •Синтаксис объявления
- •Время жизни и область видимости переменных
- •Поля
- •Локальные переменные
- •Глобальные переменные уровня процедуры. Существуют ли?
- •Константы
- •6. Лекция: Выражения. Операции в выражениях
- •Выражения
- •Приоритет и порядок выполнения операций
- •Перегрузка операций
- •С чего начинается выполнение выражения
- •Операции "увеличить" и "уменьшить" (increment, decrement)
- •Операции sizeof и typeof
- •Как получить подробную информацию о классе?
- •Статические поля и методы арифметических классов
- •Операция new
- •Арифметические операции
- •Операции отношения
- •Операции проверки типов
- •Операции сдвига
- •Логические операции
- •Условное выражение
- •Операция приведения к типу
- •7. Лекция: Присваивание и встроенные функции
- •Присваивание
- •Специальные случаи присваивания
- •Определенное присваивание
- •Еще раз о семантике присваивания
- •Рассмотрим объявления:
- •Класс Math и его функции
- •Класс Random и его функции
- •8. Лекция: Операторы языка C#
- •Операторы языка C#
- •Оператор присваивания
- •Блок или составной оператор
- •Пустой оператор
- •Операторы выбора
- •Оператор if
- •Оператор switch
- •Операторы перехода
- •Оператор goto
- •Операторы break и continue
- •Оператор return
- •Операторы цикла
- •Оператор for
- •Циклы While
- •Цикл foreach
- •9. Лекция: Процедуры и функции - методы класса
- •Процедуры и функции - функциональные модули
- •Процедуры и функции - методы класса
- •Процедуры и функции. Отличия
- •Описание методов (процедур и функций). Синтаксис
- •Список формальных аргументов
- •Тело метода
- •Вызов метода. Синтаксис
- •О соответствии списков формальных и фактических аргументов
- •Вызов метода. Семантика
- •Что нужно знать о методах?
- •Почему у методов мало аргументов?
- •Поля класса или функции без аргументов?
- •Пример: две версии класса Account
- •Функции с побочным эффектом
- •Методы. Перегрузка
- •10. Лекция: Корректность методов. Рекурсия
- •Корректность методов
- •Инварианты и варианты цикла
- •Рекурсия
- •Рекурсивное решение задачи "Ханойские башни"
- •Быстрая сортировка Хоара
- •11. Лекция: Массивы языка C#
- •Общий взгляд
- •Объявление массивов
- •Объявление одномерных массивов
- •Динамические массивы
- •Многомерные массивы
- •Массивы массивов
- •Процедуры и массивы
- •12. Лекция: Класс Array и новые возможности массивов
- •Класс Array
- •Массивы как коллекции
- •Сортировка и поиск. Статические методы класса Array
- •Класс Object и массивы
- •Массивы объектов
- •Массивы. Семантика присваивания
- •13. Лекция: Символы и строки постоянной длины в C#
- •Общий взгляд
- •Строки С++
- •Строки С#
- •Класс char
- •Класс char[] - массив символов
- •Существует ли в C# тип char*
- •14. Лекция: Строки C#. Классы String и StringBuilder
- •Класс String
- •Объявление строк. Конструкторы класса string
- •Операции над строками
- •Строковые константы
- •Неизменяемый класс string
- •Статические свойства и методы класса String
- •Метод Format
- •Методы Join и Split
- •Динамические методы класса String
- •Класс StringBuilder - построитель строк
- •Объявление строк. Конструкторы класса StringBuilder
- •Операции над строками
- •Основные методы
- •Емкость буфера
- •15. Лекция: Регулярные выражения
- •Пространство имен RegularExpression и классы регулярных выражений
- •Немного теории
- •Синтаксис регулярных выражений
- •Классы Group и GroupCollection
- •Классы Capture и CaptureCollection
- •Перечисление RegexOptions
- •Класс RegexCompilationInfo
- •Примеры работы с регулярными выражениями
- •Пример "чет и нечет"
- •Пример "око и рококо"
- •Пример "кок и кук"
- •Пример "обратные ссылки"
- •Пример "Дом Джека"
- •Пример "Атрибуты"
- •16. Лекция: Классы
- •Классы и ООП
- •Две роли классов
- •Синтаксис класса
- •Поля класса
- •Доступ к полям
- •Методы класса
- •Доступ к методам
- •Методы-свойства
- •Индексаторы
- •Операции
- •Статические поля и методы класса
- •Константы
- •Конструкторы класса
- •Деструкторы класса
- •Проектирование класса Rational
- •Свойства класса Rational
- •Конструкторы класса Rational
- •Методы класса Rational
- •Закрытый метод НОД
- •Печать рациональных чисел
- •Тестирование создания рациональных чисел
- •Операции над рациональными числами
- •Константы класса Rational
- •17. Лекция: Структуры и перечисления
- •Развернутые и ссылочные типы
- •Классы и структуры
- •Структуры
- •Синтаксис структур
- •Класс Rational или структура Rational
- •Встроенные структуры
- •Еще раз о двух семантиках присваивания
- •Перечисления
- •Персоны и профессии
- •18. Лекция: Отношения между классами. Клиенты и наследники
- •Отношения между классами
- •Отношения "является" и "имеет"
- •Отношение вложенности
- •Расширение определения клиента класса
- •Отношения между клиентами и поставщиками
- •Сам себе клиент
- •Наследование
- •Добавление полей потомком
- •Конструкторы родителей и потомков
- •Добавление методов и изменение методов родителя
- •Статический контроль типов и динамическое связывание
- •Три механизма, обеспечивающие полиморфизм
- •Пример работы с полиморфным семейством классов
- •Абстрактные классы
- •Классы без потомков
- •19. Лекция: Интерфейсы. Множественное наследование
- •Интерфейсы
- •Две стратегии реализации интерфейса
- •Преобразование к классу интерфейса
- •Проблемы множественного наследования
- •Коллизия имен
- •Наследование от общего предка
- •Встроенные интерфейсы
- •Упорядоченность объектов и интерфейс IComparable
- •Клонирование и интерфейс ICloneable
- •Сериализация объектов
- •Класс с атрибутом сериализации
- •Интерфейс ISerializable
- •20. Лекция: Функциональный тип в C#. Делегаты
- •Как определяется функциональный тип и как появляются его экземпляры
- •Функции высших порядков
- •Вычисление интеграла
- •Построение программных систем методом "раскрутки". Функции обратного вызова
- •Наследование и полиморфизм - альтернатива обратному вызову
- •Делегаты как свойства
- •Операции над делегатами. Класс Delegate
- •Операции "+" и "-"
- •Пример "Комбинирование делегатов"
- •Пример "Плохая служба"
- •21. Лекция: События
- •Классы с событиями
- •Класс sender. Как объявляются события?
- •Делегаты и события
- •Как зажигаются события
- •Классы receiver. Как обрабатываются события
- •Классы с событиями, допустимые в каркасе .Net Framework
- •Пример "Списки с событиями"
- •Класс sender
- •Классы receiver
- •Две проблемы с обработчиками событий
- •Игнорирование коллег
- •Переопределение значений аргументов события
- •Классы с большим числом событий
- •Проект "Город и его службы"
- •22. Лекция: Универсальность. Классы с родовыми параметрами
- •Наследование и универсальность
- •Синтаксис универсального класса
- •Класс с универсальными методами
- •Два основных механизма объектной технологии
- •Стек. От абстрактного, универсального класса к конкретным версиям
- •Ограниченная универсальность
- •Синтаксис ограничений
- •Список с возможностью поиска элементов по ключу
- •Как справиться с арифметикой
- •Родовое порождение класса. Предложение using
- •Универсальность и специальные случаи классов
- •Универсальные структуры
- •Универсальные интерфейсы
- •Универсальные делегаты
- •Framework .Net и универсальность
- •23. Лекция: Отладка и обработка исключительных ситуаций
- •Корректность и устойчивость программных систем
- •Жизненный цикл программной системы
- •Три закона программотехники
- •Первый закон (закон для разработчика)
- •Второй закон (закон для пользователя)
- •Третий закон (закон чечако)
- •Отладка
- •Создание надежного кода
- •Искусство отладки
- •Отладочная печать и условная компиляция
- •Классы Debug и Trace
- •Метод Флойда и утверждения Assert
- •Классы StackTrace и BooleanSwitch
- •Отладка и инструментальная среда Visual Studio .Net
- •Обработка исключительных ситуаций
- •Обработка исключений в языках C/C++
- •Схема обработки исключений в C#
- •Выбрасывание исключений. Создание объектов Exception
- •Захват исключения
- •Параллельная работа обработчиков исключений
- •Блок finally
- •Схема Бертрана обработки исключительных ситуаций
- •Класс Exception
- •Организация интерфейса
- •Форма и элементы управления
- •Взаимодействие форм
- •Модальные и немодальные формы
- •Передача информации между формами
- •Образцы форм
- •Главная кнопочная форма
- •Шаблон формы для работы с классом
- •Работа со списками (еще один шаблон)
- •Элемент управления класса ListBox
- •Наследование форм
- •Два наследника формы TwoLists
- •Огранизация меню в формах
- •Создание меню в режиме проектирования
- •Классы меню
- •Создание инструментальной панели с командными кнопками
- •Рисование в форме
- •Класс Graphics
- •Методы класса Graphics
- •Класс Pen
- •Класс Brush
- •Проект "Паутина Безье, кисти и краски"
- •Паутина Безье
- •Событие Paint
- •Кисти и краски
- •Абстрактный класс Figure
- •Классы семейства геометрических фигур
- •Класс Ellipse
- •Класс Circle
- •Класс LittleCircle
- •Класс Rect
- •Класс Square
- •Класс Person
- •Список с курсором. Динамические структуры данных
- •Классы элементов списка
- •Организация интерфейса
12. Лекция: Класс Array и новые возможности массивов
Класс Array
Нельзя понять многие детали работы с массивами в C#, если не знать устройство класса Array из библиотеки FCL, потомками которого являются все классы-массивы. Рассмотрим следующие объявления:
//Класс Array
int[] ar1 = new int[5]; double[] ar2 ={5.5, 6.6, 7.7}; int[,] ar3 = new Int32[3,4];
Зададимся естественным вопросом: к какому или к каким классам принадлежат объекты ar1, ar2 и ar3? Ответ прост: все они принадлежат к разным классам. Переменная ar1 принадлежит к классу int[] - одномерному массиву значений типа int, ar2 - double[] - одномерному массиву значений типа double, ar3 - двумерному массиву значений типа int. Следующий закономерный вопрос: а что общего есть у этих трех объектов? Прежде всего, все три класса этих объектов, как и другие классы, являются потомками класса Object, а потому имеют общие методы, наследованные от класса Object и доступные объектам этих классов.
У всех классов, являющихся массивами, много общего, поскольку все они являются потомками класса System.Array. Класс System.Array наследует ряд интерфейсов: ICloneable, IList, ICollection, IEnumerable, а, следовательно, обязан реализовать все их методы и свойства. Помимо наследования свойств и методов класса Object и вышеперечисленных интерфейсов, класс Array имеет довольно большое число собственных методов и свойств. Взгляните, как выглядит отношение наследования на семействе классов, определяющих массивы.
Рис. 12.1. Отношение наследования на классах-массивах
Благодаря такому мощному родителю, над массивами определены самые разнообразные операции - копирование, поиск, обращение, сортировка, получение различных характеристик. Массивы можно рассматривать как коллекции и устраивать циклы For Each для перебора всех элементов. Важно и то, что когда у семейства классов есть общий родитель, то можно иметь общие процедуры обработки различных потомков этого родителя. Для общих процедур работы с массивами характерно, что один или несколько формальных аргументов имеют родительский тип Array. Естественно, внутри такой процедуры может понадобиться анализ - какой реальный тип массива передан в процедуру.
Рассмотрим пример подобной процедуры. Ранее я для печати элементов массива использовал различные процедуры PrintAr1, PrintAr2 и так далее, по одной для каждого класса массива. Теперь я приведу общую процедуру, формальный аргумент которой будет принадлежать родителю всех классов-массивов, что позволит передавать массив любого класса в качестве фактического аргумента:
public static void PrintAr(string name, Array A)
{
Console.WriteLine(name); switch (A.Rank)
{
case 1:
for(int i = 0; i<A.GetLength(0);i++) Console.Write("\t" + name + "[{0}]={1}",
i, A.GetValue(i)); Console.WriteLine(); break;
case 2:
for(int i = 0; i<A.GetLength(0);i++)
{
for(int j = 0; j<A.GetLength(1);j++) Console.Write("\t" + name + "[{0},{1}]={2}",
i,j, A.GetValue(i,j)); Console.WriteLine();
}
break; default: break;
}
}//PrintAr
Вот как выглядит создание массивов и вызов процедуры печати:
public void TestCommonPrint()
{
//Класс Array
int[] ar1 = new int[5]; double[] ar2 ={5.5, 6.6, 7.7}; int[,] ar3 = new Int32[3,4];
Arrs.CreateOneDimAr(ar1);Arrs.PrintAr("ar1", ar1); Arrs.PrintAr("ar2", ar2); Arrs.CreateTwoDimAr(ar3);Arrs.PrintAr("ar3", ar3);
}//TestCommonPrint
Вот результаты вывода массивов ar1, ar2 и ar3.
Рис. 12.2. Печать массивов. Результаты работы процедуры PrintAr
Приведу некоторые комментарии.
Первое, на что следует обратить внимание: формальный аргумент процедуры принадлежит базовому классу Array, наследниками которого являются все массивы в CLR и, естественно, все массивы C#.
Для того чтобы сохранить возможность работы с индексами, как в одномерном, так и в двумерном случае, пришлось организовать разбор случаев. Свойство Rank, возвращающее размерность массива, используется в этом разборе.
К элементам массива A, имеющего класс Array, нет возможности прямого доступа в обычной манере - A [<индексы>], но зато есть специальные методы GetValue
(<индексы>) и SetValue (<индексы>).
Естественно, разбор случаев можно продолжить, придав процедуре большую функциональность.
Заметьте, если разбор случаев вообще не делать, а использовать PrintAr только для печати одномерных массивов, то она будет столь же проста, как и процедура PrintAr1, но сможет печатать любые одномерные массивы, независимо от типа их элементов.
Массивы как коллекции
В ряде задач массивы C# целесообразно рассматривать как коллекции, не используя систему индексов для поиска элементов. Это, например, задачи, требующие однократного или многократного прохода по всему массиву - нахождение суммы элементов, нахождение максимального элемента, печать элементов. В таких задачах вместо циклов типа For по каждому измерению достаточно рассмотреть единый цикл For Each по всей коллекции. Эта возможность обеспечивается тем, что класс Array наследует интерфейс IEnumerable. Обратите внимание, этот интерфейс обеспечивает только возможность чтения элементов коллекции (массива), не допуская их изменения. Применим эту стратегию и построим еще одну версию процедуры печати. Эта версия будет самой короткой и самой универсальной, поскольку подходит для печати массива, независимо от его размерности и типа элементов. Вот ее код:
public static void PrintCollection(string name,Array A)
{
Console.WriteLine(name); foreach (object item in A )
Console.Write("\t {0}", item); Console.WriteLine();
}//PrintCollection
Конечно, за все нужно платить. Платой за универсальность процедуры печати является то, что многомерный массив печатается как одномерный без разделения элементов на строки.
К сожалению, ситуация с чтением и записью элементов массива не симметрична. Приведу вариант процедуры CreateCollection:
public static void CreateCollection(Array A)
{
int i=0;
foreach (object item in A )
//item = rnd.Next(1,10); //item read only A.SetValue(rnd.Next(1,10), i++);
}//CreateCollection
Заметьте, эту процедуру сделать универсальной не удается, поскольку невозможно модифицировать элементы коллекции. Поэтому цикл For Each здесь ничего не дает, и разумнее использовать обычный цикл. Данная процедура не универсальна и позволяет создавать элементы только для одномерных массивов.
Сортировка и поиск. Статические методы класса Array
Статические методы класса Array позволяют решать самые разнообразные задачи:
1.Copy - позволяет копировать весь массив или его часть в другой массив.
2.IndexOf, LastIndexOf - определяют индексы первого и последнего вхождения образца в массив, возвращая -1, если такового вхождения не обнаружено.
3.Reverse - выполняет обращение массива, переставляя элементы в обратном порядке.
4.Sort - осуществляет сортировку массива.
5.BinarySearch - определяет индекс первого вхождения образца в отсортированный массив, используя алгоритм двоичного поиска.
Все методы перегружены и имеют ряд модификаций. Большинство из этих методов применимо только к одномерным массивам. Приведу примеры различных операций, доступных при работе с массивами, благодаря наследованию от класса Array:
public void TestCollection()
{
//операции над массивами int nc = 7;
int[] col1 = new int[nc], col2 = new int[nc]; double[] col3 = new double[nc];
int[,] col4 = new int[2,2]; Arrs.CreateCollection(col1); Arrs.PrintCollection("col1",col1); Arrs.CreateCollection(col2); Arrs.PrintCollection("col2",col2); Arrs.CreateCollection(col3); Arrs.PrintCollection("col3",col3); Arrs.CreateTwoDimAr(col4); Arrs.PrintCollection("col4",col4); //сортировка, поиск, копирование // поиск элемента
int first = Array.IndexOf(col1, 2); int last = Array.LastIndexOf(col1,2); if (first == -1)
Console.WriteLine("Нет вхождений 2 в массив col1"); else if (first ==last)
Console.WriteLine("Одно вхождение 2 в массив col1"); else
Console.WriteLine("Несколько вхождений 2 в массив col1"); //first = Array.IndexOf(col4, 4);
//только одномерный массив
Array.Reverse(col1); Console.WriteLine("Обращение массива col1:"); Arrs.PrintCollection("col1",col1); //Копирование
Array.Copy(col1, col3, col1.Length);
Console.WriteLine(" Массив col3 после копирования массива col1:"); Arrs.PrintCollection("col3",col3);
Array.Copy(col1,1,col2,1,2);
Console.WriteLine("копирование двух элементов col1 в col2:"); Arrs.PrintCollection("col1",col1); Arrs.PrintCollection("col2",col2);
//быстрая сортировка Хоара
Array.Sort(col1); Console.WriteLine("Отсортированный массив col1:"); Arrs.PrintCollection("col1",col1);
first = Array.BinarySearch(col1, 2); Console.WriteLine("Индекс вхождения 2 в col1: {0}",first); //Создание экземпляра (массива)
Array my2Dar = Array.CreateInstance(typeof(double), 2,3); Arrs.PrintCollection("my2Dar",my2Dar);
//клонирование
my2Dar = (Array)col4.Clone(); Console.WriteLine("Массив my2Dar после клонирования
col4:");
Arrs.PrintCollection("my2Dar",my2Dar); //копирование CopyTo col1.CopyTo(col2,0);
Console.WriteLine("Массив col2 после копирования col1:"); Arrs.PrintCollection("col2",col2);
}
В этой процедуре продемонстрированы вызовы различных статических методов класса Array. Для метода Copy показан вызов двух реализаций этого метода, когда копируется весь массив и часть массива. Закомментированный оператор вызова метода IndexOf напоминает о невозможности использования методов поиска при работе с многомерными массивами. Приведу результаты вывода, порожденные этим кодом.
Рис. 12.3. Результаты применения статических методов класса Array
Таблица 12.1. Свойства класса Array Свойство Родитель Описание
|
IsFixedSize |
|
|
Интерфейс |
|
|
True, если массив статический |
|
|
|
|
IList |
|
|
|
|
|
|
|
|
|
||
|
IsReadOnly |
|
|
Интерфейс |
|
|
Для всех массивов имеет значение false |
|
|
|
|
IList |
|
|
|
|
|
|
|
||||
|
IsSynchronized |
|
|
Интерфейс |
|
|
True или False, в зависимости от того, установлена ли |
|
|
|
|
ICollection |
|
|
синхронизация доступа для массива |
|
|
|
|
|
|
|
Собственный метод синхронизации доступа к массиву. |
|
SyncRoot |
|
Интерфейс |
|
|||
|
|
|
|
ICollection |
|
|
При работе с массивом его можно закрыть на время |
|
|
|
|
|
|
|
обработки, что запрещает его модификацию каким-либо |
|
|
|
|
|
|
|
потоком: |
Array myCol = new int[];
|
|
lock( myCol.SyncRoot ) { |
|
|
foreach ( Object item in myCol ) |
|
|
{ |
|
|
// безопасная обработка массива } |
|
|
|
Length |
|
Число элементов массива |
|
|
|
Rank |
|
Размерность массива |
|
|
|
Таблица 12.2. Статические методы класса Array |
||
|
|
|
Метод |
Описание |
|
|
|
|
BinarySearch |
Двоичный поиск. Описание и примеры даны в тексте |
|
|
|
|
Clear |
Выполняет начальную инициализацию элементов. В зависимости от |
|
|
типа элементов устанавливает значение 0 для арифметического типа, |
|
|
false - для логического типа, Null для ссылок, "" - для строк. |
|
|
|
|
Copy |
Копирование части или всего массива в другой массив. Описание и |
|
|
примеры даны в тексте |
|
|
|
|
CreateInstance Класс Array, в отличие от многих классов, может создавать свои экземпляры не только с помощью конструктора new, но и при вызове метода CreateInstance:
Array my2Dar = Array.CreateInstance(typeof(double), 2,2)
IndexOf |
Индекс первого вхождения образца в массив. Описание и примеры |
|
даны в тексте |
|
|
LastIndexOf |
Индекс последнего вхождения образца в массив. Описание и примеры |
|
даны в тексте |
|
|
Reverse |
Обращение одномерного массива. Описание и примеры даны в тексте |
|
|
Sort |
Сортировка массива. Описание и примеры даны в тексте |
|
|
Сводка свойств и методов класса Array
Многие возможности, которыми можно пользоваться при работе с массивами, уже обсуждены. В завершение этой темы в таблицах 12.1-12.3 приведем сводку всех свойств и методов класса Array.
Таблица 12.3. Динамические методы класса Array
Метод |
Родитель |
Описание |
|
|
|
Equals |
Класс Object |
Описание и примеры даны в предыдущих главах. |
|
|
|
GetHashCode |
Класс Object |
Описание и примеры даны в предыдущих главах. |
|
|
|
GetType |
Класс Object |
Описание и примеры даны в предыдущих главах. |
|
|
|
ToString |
Класс Object |
Описание и примеры даны в предыдущих главах. |
|
|
|
Clone |
Интерфейс |
Позволяет создать плоскую или глубокую копию |
|
ICloneable |
массива. В первом случае создаются только элементы |
|
|
первого уровня, а ссылки указывают на те же самые |
|
|
объекты. Во втором случае копируются объекты на |
|
|
всех уровнях. Для массивов создается только плоская |
|
|
копия. |
|
|
|
CopyTo |
Интерфейс |
Копируются все элементы одномерного массива в |
|
ICollection |
другой одномерный массив, начиная с заданного |
|
|
индекса: |
|
|
col1.CopyTo(col2,0); |
|
|
|
GetEnumerator |
Интерфейс |
Стоит за спиной цикла ForEach |
|
IEnumerable |
|
|
|
|
GetLength |
|
Возвращает число элементов массива по указанному |
|
|
измерению. Описание и примеры даны в тексте главы. |
|
|
|