- •1. C# и платформа .Net 7
- •2. Создание приложений .Net с использованием c# 38
- •3. Основы c# 71
- •4. Массивы, кортежи и строки 118
- •5. Классы и объекты 157
- •6. Перегрузка функций-членов класса 195
- •7. Наследование и полиморфизм 214
- •8. Обработка исключений 231
- •9. Интерфейсы, структуры и перечисления 255
- •10. Делегаты, события и лямбда-выражения 270
- •11. Обобщения 296
- •12. Коллекции, перечислители и итераторы 323
- •13. Время жизни объектов 370
- •1.C# и платформа .Net
- •1.1Становление c#
- •Язык c и api-интерфейс Windows
- •1.2Создание c#
- •Развитие c#
- •1.3Версии c#
- •1.4Связь c# со средой .Net Framework
- •Что нового в .Net Framework 4
- •1.5Общеязыковая исполняющая среда clr
- •1.6Общая система типов cts
- •1.7Общеязыковая спецификация cls
- •1.8Сборки
- •Приватные сборки
- •Разделяемые сборки
- •Однофайловые и многофайловые сборки
- •1.9Промежуточный язык cil
- •Утилита ildasm.Exe
- •1.10Классы и пространства имен Классы .Net Framework
- •Пространства имен
- •Роль корневого пространства Microsoft
- •1.11Общеязыковая инфраструктура cli
- •2.Создание приложений .Net с использованием c#
- •2.2Компилятор csc.Exe
- •Добавление ссылок на внешние сборки
- •Компиляция нескольких файлов исходного кода
- •Работа с ответными файлами в c#
- •2.3Типы приложений .Net
- •Создание приложений asp.Net
- •Возможности asp.Net
- •Элементы управления веб-сервера
- •Создание Windows-форм
- •Службы Windows
- •2.4Работа с Visual Studio 2010
- •2.5Создание проекта в VisualStudio 2010
- •2.6Изучение проекта и заполнение его кодом
- •2.7Компоновка проекта
- •2.8Отладка кода
- •2.9Рефакторинг кода
- •2.10Расширение кода
- •2.11Утилита Class Designer
- •2.12Интегрируемая система документации .Net Framework
- •3.Основы c#
- •3.1Основы ооп
- •3.2Простая программа на c#
- •3.3Комментарии
- •3.4Переменные
- •3.5Область видимости переменных, константы
- •3.6Типы данных
- •3.7Литералы
- •3.8Преобразования типов
- •3.9Арифметические операторы
- •3.10Операторы отношения и логические операторы
- •If (var1 & var2) Console.WriteLine("Данный текст не выведется");
- •3.11Оператор присваивания
- •3.12Поразрядные операторы
- •3.13Тернарный оператор
- •3.14Условные операторы
- •If (условие)
- •3.15Циклы for и while
- •3.16Циклы do while и foreach
- •3.17Операторы перехода
- •4.Массивы, кортежи и строки
- •4.1Массивы
- •4.2Многомерные массивы
- •4.3Ступенчатые (зубчатые) массивы
- •4.4Класс Array
- •4.5Создание динамического массива
- •4.6Массивы в качестве параметров
- •4.7Кортежи
- •4.8Строки
- •Построение строк
- •Постоянство строк
- •Работа со строками
- •Методы класса String
- •Методы работы со строками
- •Немного о сравнении строк в c#
- •4.9Класс StringBuilder
- •Методы класса StringBuilder
- •4.10Форматирующие строки
- •Спецификаторы формата для чисел
- •Спецификаторы формата для дат
- •4.11Регулярные выражения в c#
- •4.11.1Введение в регулярные выражения
- •Метасимволы, используемые в регулярных выражениях c#
- •4.11.2Использование регулярных выражений в c#
- •Структура перечисления RegexOptions
- •Метасимволы замены в регулярных выражениях c#
- •5.Классы и объекты
- •5.1Классы
- •Общая форма определения класса
- •Данные-члены
- •5.2Класс Object
- •5.2.1Методы System.Object
- •5.2.2Класс object как универсальный тип данных
- •5.3Создание объектов
- •5.3.1Переменные ссылочного типа и присваивание
- •5.3.2Инициализаторы объектов
- •5.4Методы
- •Объявление методов
- •Возврат из метода и возврат значения
- •Использование параметров
- •5.5Конструкторы
- •5.6Сборка мусора и деструкторы
- •Деструкторы
- •5.7Ключевое слово this
- •5.8Доступ к членам класса
- •Модификаторы доступа
- •Организация закрытого и открытого доступа
- •5.9Модификаторы параметров
- •Модификаторы параметров
- •5.9.1Модификатор ref
- •5.9.2Модификатор out
- •5.9.3Модификатор params
- •5.10Необязательные и именованные аргументы
- •5.10.1Необязательные аргументы
- •5.10.2Именованные аргументы
- •5.11Рекурсия
- •5.12Ключевое слово static
- •5.12.1Статические конструкторы
- •5.12.2Статические классы
- •5.13Индексаторы
- •5.13.1Одномерные индексаторы
- •5.13.2Многомерные индексаторы
- •5.14Свойства
- •Автоматически реализуемые свойства
- •5.15Модификаторы доступа в аксессорах
- •6.Перегрузка функций-членов класса
- •6.1Перегрузка методов
- •6.2Перегрузка конструкторов
- •6.3Перегрузка индексаторов
- •6.4Основы перегрузки операторов
- •6.4.1Перегрузка бинарных операторов
- •6.4.2Перегрузка унарных операторов
- •6.4.3Выполнение операций со встроенными в c# типами данных
- •6.5Перегрузка операторов отношения и операторов true - false
- •6.5.1Перегрузка операторов отношения
- •6.5.2Перегрузка операторов true и false
- •6.6Перегрузка логических операторов
- •6.6.1Перегрузка укороченных логических операторов
- •6.7Операторы преобразования
- •7.Наследование и полиморфизм
- •7.1Основы наследования
- •7.2Защищенный доступ и исключение наследования
- •7.2.1Организация защищенного доступа
- •7.2.2Ключевое слово sealed
- •7.2.3Диаграммы классов Visual Studio
- •7.3Конструкторы и наследование
- •7.4Наследование и сокрытие имен
- •Применение ключевого слова base для доступа к скрытому имени
- •7.5Ссылки на базовый класс и объекты производных классов
- •7.6Виртуальные методы, свойства и индексаторы
- •7.7Абстрактные классы
- •8.Обработка исключений
- •8.1Основы обработки исключений
- •8.1.1Роль обработки исключений в .Net
- •8.1.2Составляющие процесса обработки исключений в .Net
- •8.2Перехват исключений
- •8.3Класс Exception
- •8.4Конфигурирование состояния исключения
- •8.4.1Свойство TargetSite
- •8.4.2Свойство StackTrace
- •8.4.3Свойство HelpLink
- •8.4.4Свойство Data
- •8.5Исключения уровня системы и приложения
- •8.5.1Исключения уровня системы (System.SystemException)
- •8.5.2Исключения уровня приложения (System.ApplicationException)
- •8.5.3Создание специальных исключений
- •8.6Обработка многочисленных исключений
- •8.6.1Применение нескольких операторов catch
- •1 2 0 10 12 Индекс выходит за пределы
- •8.6.2Перехват всех исключений
- •8.6.3Вложение блоков try
- •8.7Операторы throw и finally
- •8.7.1Оператор throw
- •8.7.2Повторное генерирование исключений
- •8.7.3Использование блока finally
- •8.8Исключения, связанные с поврежденным состоянием (Corrupted State Exceptions)
- •8.9Ключевые слова checked и unchecked
- •9.Интерфейсы, структуры и перечисления
- •9.1Интерфейсы
- •9.2Интерфейсные ссылки
- •9.2.1Ключевое слово as
- •9.2.2Ключевое слово is
- •9.3Интерфейсные свойства и индексаторы
- •9.3.1Интерфейсные свойства
- •9.3.2Интерфейсные индексаторы
- •9.4Наследование интерфейсов
- •9.5Явная реализация интерфейса
- •9.6Структуры
- •Назначение структур
- •9.7Перечисления
- •10.Делегаты, события и лямбда-выражения
- •10.1Делегаты
- •10.1.1Определение типа делегата в c#
- •10.1.2Базовые классы System.MulticastDelegate и System.Delegate
- •10.2Групповой вызов и адресация делегируемых методов
- •10.2.1Групповое преобразование делегируемых методов
- •10.2.2Применение методов экземпляра в качестве делегатов
- •10.2.3Групповая адресация
- •10.3Ковариантность и контравариантность делегатов
- •10.5Анонимные методы
- •10.6Лямбда-выражения
- •10.6.1Одиночные лямбда-выражения
- •10.6.2Блочные лямбда-выражения
- •10.7События
- •10.8Аксессоры событий
- •10.9Обработка событий в среде .Net Framework
- •Void обработчик(object отправитель, EventArgs е)
- •11.Обобщения
- •11.1Обзор обобщений
- •Рекомендации по именованию
- •11.2Обобщенные классы
- •11.3Ограниченные типы
- •Связь между параметрами типа с помощью ограничений
- •11.4Ограниченные классы
- •11.5Ограниченные интерфейсы и конструкторы Применение ограничения на интерфейс
- •Применение ограничения new() на конструктор
- •11.6Ограничения ссылочного типа и типа значения
- •11.7Иерархии обобщенных классов
- •11.8Средства обобщений Значения по умолчанию
- •Статические члены
- •11.9Обобщенные методы
- •11.10Обобщенные структуры
- •11.11Обобщенные делегаты
- •11.12Обобщенные интерфейсы
- •Сравнение экземпляров параметра типа
- •11.13Модификация обобщенных методов
- •11.13.1Переопределение виртуальных методов в обобщенном классе
- •11.13.2Перегрузка методов с несколькими параметрами типа
- •11.14Ковариантность и контравариантность в обобщениях
- •11.14.1Применение ковариантности в обобщенном интерфейсе
- •11.14.2Применение контравариантности в обобщенном интерфейсе
- •12.Коллекции, перечислители и итераторы
- •12.1Краткий обзор коллекций
- •12.2Необобщенные коллекции
- •12.2.1Интерфейсы необобщенных коллекций
- •12.2.2Структура DictionaryEntry
- •12.2.3Классы необобщенных коллекций
- •12.3Обобщенные коллекции
- •12.3.1Интерфейсы обобщенных коллекций
- •12.3.3Классы обобщенных коллекций
- •12.4Класс ArrayList
- •12.5Класс Hashtable
- •12.10.1Тип ключа
- •12.13Битовые коллекции
- •12.13.1Класс BitArray
- •12.13.2Структура BitVector32
- •12.14Специальные и наблюдаемые коллекции
- •12.14.1Специальные коллекции
- •12.14.2Наблюдаемые коллекции
- •12.15Параллельные коллекции
- •12.16Реализация интерфейса iComparable
- •12.17Реализация интерфейса iComparer
- •12.18Перечислители
- •12.18.1Применение обычного перечислителя
- •12.18.2Применение перечислителя типа iDictionaryEnumerator
- •12.19Реализация интерфейсов iEnumerable и iEnumerator
- •12.20Итераторы
- •13.Время жизни объектов
- •13.1Базовые сведения о времени жизни объектов
- •Установка объектных ссылок в null
- •13.2Роль корневых элементов приложения
- •Поколения объектов
- •13.3Параллельная и фоновая сборка мусора Параллельная сборка мусора в версиях .Net 1.0 - .Net 3.5
- •Фоновая сборка мусора в версии .Net 4.0
- •13.5Финализируемые объекты
- •Переопределение System.Object.Finalize()
- •Описание процесса финализации
- •13.6Высвобождаемые объекты
- •Повторное использование ключевого слова using в c#
- •13.7Финализируемые и высвобождаемые типы
- •Формализованный шаблон очистки
- •13.8Отложенная инициализация объектов
- •Полезные ссылки
2.6Изучение проекта и заполнение его кодом
В данной статье речь пойдет о средствах, которые Visual Studio предлагает для оказания помощи с добавлением кода в проект.
Редактор с возможностью сворачивания блоков кода
Одним из замечательных средств Visual Studio является используемый по умолчанию редактор с возможностью сворачивания блоков кода.
Сворачивание позволяет сосредоточить внимание только на тех участках кода, которые представляют интерес, и скрывать те из них, которые в текущий момент не важны:
|
|
Если способ разбиения кода на блоки не нравится, можно указать собственные сворачиваемые блоки с помощью директив препроцессора (#region и #endregion). Например, для обеспечения возможности сворачивания кода внутри метода Main() следует добавить эти директивы так, как показано на рисунке:
|
Редактор кода автоматически обнаружит директиву #region и разместит рядом с ней очередной знак "минус", предоставляя возможность сворачивать данный блок. Заключение блока кода в директивы #region и #endregion заставляет редактор кода свернуть его, а также снабдить любым желаемым комментарием в директиве #region. Компиляторы игнорируют эти директивы и компилируют метод Main() обычным образом:
|
Помимо возможности сворачивать блоки кода, поставляемый в Visual Studio 2010 редактор кода поддерживает все функции редактора Visual Studio 6. В частности, в нем есть средство IntelliSense, которое позволяет не только экономить время при вводе кода, но и гарантировать правильность вводимых параметров.
Разработчики приложений на С++ заметят, что теперь средство IntelliSense стало совершеннее, чем в Visual Studio 6, и работает быстрее. По сравнению с Visual Studio 2005 оно также значительно улучшилось. Теперь IntelliSense стало более интеллектуальным, поскольку умеет запоминать предпочитаемые варианты и предлагать сначала их.
Вдобавок редактор кода Visual Studio 2010 позволяет выполнять некоторую синтаксическую проверку вводимого кода и выделяет подчеркиванием большинство синтаксических ошибок еще до компиляции кода. При наведении курсора мыши на подчеркнутый текст в редакторе появляется небольшое окошко с текстом, поясняющим, в чем состоит ошибка. Разработчикам приложений на Visual Basic эта функция, называемая отладкой на стадии проектирования, знакома на протяжении довольно многих лет, а теперь она стала доступной и разработчикам приложений на C# и С++.
Окно Design View
При разработке приложения с пользовательским интерфейсом, наподобие приложения Windows, библиотеки элементов управления Windows или приложения ASP.NET, нужно использовать окно Design View (Конструктор). В этом окне предлагается визуальное представление того, как будет выглядеть форма. Обычно окно Design View применяется в сочетании с еще одним окном, которое называется Toolbox (Панель инструментов). В этом окне отображается огромное количество компонентов .NET, которые можно перетаскивать в разрабатываемое приложение.
Количество компонентов, поставляемых для целей разработки в окне Toolbox, в Visual Studio 2010 значительно увеличилось. Доступные категории компонентов в этом окне в некоторой степени зависят от типа редактируемого проекта; например, при редактировании проекта WpfApplication из решения DemoSolution количество доступных категорий будет гораздо большим, чем при редактировании проекта ConsoleApplication. Ниже перечислены наиболее важные категории:
Data (Данные)
В эту категорию входят классы, которые позволяют подключаться к источникам данных и управлять содержащимися в них данными. В частности, здесь доступны компоненты для работы с Microsoft SQL Server, Oracle или любым другим источником данных OLE DB.
Common Controls (Общие элементы управления)
В эту категорию входят элементы управления Windows Forms и WPF, которые представляют собой классы, позволяющие визуализировать элементы вроде текстовых полей, окон списков или древовидных структур, предназначенных для работы с приложениями "толстых" клиентов.
Standard (Стандартные)
В эту категорию входят элементы управления Web Forms, представляющие собой классы, которые, по сути, делают то же самое, что и элементы управления Windows, но только работают в контексте веб-браузеров и предусматривают отправку HTML-вывода для имитации элементов управления в этих браузерах. (Увидеть их можно будет только при работе с приложениями ASP.NET.)
Components (Компоненты)
В этой категории предлагаются разнообразные классы .NET, позволяющие обеспечивать выполнение на машине разнообразных полезных задач, наподобие подключения к службам каталогов или журналу регистрации событий.
В окно Toolbox можно добавлять собственные специальные категории, щелкая правой кнопкой мыши на любой из категорий и выбирая в контекстном меню пункт Add Tab (Добавить вкладку). Кроме того, в окно Toolbox также можно помещать и другие элементы управления, выбирая в том же самом контекстном меню пункт Choose Items (Выбрать элементы). Это особенно удобно для добавления предпочитаемых компонентов СОМ и элементов управления ActiveX, которые по умолчанию в окне Toolbox не отображаются. После добавления элемент управления СОМ можно будет перетаскивать в проект точно так же, как и любой элемент управления .NET. В Visual Studio автоматически добавляется весь код, который требуется для обеспечения функциональной совместимости с элементом управления СОМ, чтобы он мог вызываться в проекте. В этом случае в проект добавляется элемент управления .NET, который Visual Studio создает "за кулисами", служащий оболочкой для элемента управления СОМ.
Окно Properties
Окно Properties (Свойства) тоже берет свое начало еще из старой IDE-среды Visual Basic. Как известно классы .NET могут реализовать свойства. На самом деле, базовые классы .NET, которые представляют формы и элементы управления, имеют множество свойств. Эти свойства определяют внешний вид и поведение, например, Width, Height, Enabled (указывающее, разрешен ли ввод в данном элементе управления) или Text (текст, отображаемый в данном элементе управления), и Visual Studio известно о многих из них. Окно Properties позволяет редактировать начальные значения большинства таких свойств для тех элементов управления, которые Visual Studio обнаруживает при чтении исходного кода.
В окне Properties могут отображаться и события. Для просмотра событий выделите интересующий элемент управления в IDE-среде или выберите элемент в раскрывающемся списке в окне Properties, щелкнув на значке с изображением молнии в верхней части окна.
Окно Class View
В отличие от окна Properties окно Class view (Классы) берет свое начало из сред разработки приложений на С++ (и J++). В Visual Studio оно в действительности представляет собой не самостоятельное окно, а скорее дополнительную вкладку в окне Solution Explorer. По умолчанию оно даже не появляется в окне Solution Explorer. Чтобы сделать его видимым, выберите в меню View (Вид) пункт Class View (Классы) или нажмите быструю комбинацию клавиш <Ctrl+Shift+C>. В этом окне отображается иерархия пространств имен и классов, которые присутствуют в исходном коде. Оно предоставляет древовидную структуру, разворачивая которую, можно просматривать классы, содержащиеся в пространствах имен, и элементы, предлагаемые классами.
Замечательным свойством окна Class View является то, что в результате щелчка правой кнопкой мыши на имени любого элемента, к которому имеется доступ в исходном коде, будет появляться контекстное меню с пунктом Go То Definition (Перейти к определению). Выбор этого пункта позволяет перейти к тому месту программы в окне редактора кода, в котором находится определение данного элемента. Тот же результат можно получить, дважды щелкнув на элементе в окне Class View (или щелкнув правой кнопкой мыши на интересующем элементе в редакторе исходного кода и выбрав такой же пункт в контекстном меню). В этом контекстном меню также имеются пункты, позволяющие добавлять в класс поле, метод, свойство или индексатор. Это значит, что можно указать детали в диалоговом окне, а соответствующий код добавится автоматически. Для добавления полей и методов такой подход может оказаться не особенно полезным, поскольку добавить их в код несложно, однако для добавления свойств индексаторов он исключительно удобен и позволяет существенно сократить объем набираемого кода.
