- •Глава 1. История языка программирования c# 6
- •Глава 2. Язык программирования c# и платформа .Net Framework 16
- •Глава 3. Основы программирования на языке c# 50
- •Глава 4. Расширенные возможности программирования на языке c# 284
- •Глава 5. Интегрированная среда разработки Microsoft Visual Studio 2010 332
- •Глава 1. История языка программирования c#
- •1.1. История языка программирования c# История языка программирования c#
- •1. Появление и развитие языка c#
- •2. Название языка c#
- •3. Особенности языка c#
- •4. Версии языка c# и развитие языка
- •5. Текущая версия языка c#, краткое и полное описания версии
- •1.2. Развитие языков программирования до c# Развитие языков программирования до c#
- •1. Единство языка программирования c# и платформы .Net
- •2. Язык программирования c и api-интерфейс Windows
- •4. Среда разработки Visual Studio 6.0
- •5. Язык программирования Java
- •Глава 2. Язык программирования c# и платформа .Net framework
- •2.1. Связь языка программирования c# со средой .Net Framework Связь языка программирования c# со средой .Net Framework
- •1. Платформенная среда .Net Framework 4
- •2. Что нового в .Net Framework 4
- •3. Динамическая типизация
- •4. Ковариантность и контравариантность
- •5. Технология asp.Net mvc
- •2.2. Общеязыковая исполняющая среда clr Общеязыковая исполняющая среда clr
- •2.3. Общая система типов cts Общая система типов cts
- •1. Общая система типов cts
- •2. Члены типов
- •3. Встроенные типы данных
- •2.4. Общеязыковая спецификация cts Общеязыковая спецификация cls
- •2.5. Сборки в .Net Framework Сборки в .Net Framework
- •1. Сборки в .Net Framework
- •2. Приватные сборки
- •3. Разделяемые сборки
- •4. Однофайловые и многофайловые сборки
- •2.6. Промежуточный язык cil Промежуточный язык cil
- •1. Промежуточный язык cil
- •2. Утилита ildasm.Exe
- •2.7. Классы .Net Framework и пространства имён Классы .Net Framework и пространства имён
- •1. Классы .Net Framework
- •2. Пространства имён
- •3. Роль корневого пространства Microsoft
- •2.8. Общеязыковая инфраструктура cli Общеязыковая инфраструктура cli
- •2.9. Компилятор «csc.Exe» Компилятор «csc.Exe»
- •1. Командная строка Visual Studio (2010)
- •2. Компилятор «csc.Exe»: создание файла *.Cs
- •3. Компилятор «csc.Exe»: указание целевых входных и выходных параметров
- •4. Добавление ссылок на внешние сборки
- •5. Компиляция нескольких файлов исходного кода
- •6. Работа с ответными файлами в c#
- •Глава 3. Основы программирования на языке c#
- •3.1. Основы объектно-ориентированного программирования Основы объектно-ориентированного программирования
- •1. Основы объектно-ориентированного программирования
- •2. Роль инкапсуляции
- •3. Роль наследования
- •4. Роль полиморфизма
- •3.2. Пример простейшей программы «Hello, World!» Пример простейшей программы «Hello, world!»
- •1. «Hello, world!» на c#
- •2. Комментарии
- •3. Комментарии к xml-документация
- •4. Метод Main
- •6. Разное
- •7. Ввод и вывод
- •3.3. Общая структура программы Общая структура программы на c#
- •3.4. Введение в систему типов
- •3.4.1. Справочные таблицы по типам данных Справочные таблицы по типам данных
- •1. Таблица встроенных типов
- •2. Таблица целых типов
- •3. Таблица типов с плавающей запятой
- •4. Таблица значений по умолчанию
- •5. Таблица типов значений
- •6. Таблица неявных числовых преобразования
- •7. Таблица явных числовых преобразований
- •8. Таблица форматирования числовых результатов
- •3.4.2. Понятие «Переменная», «Поле» и «Константа» Понятие «Переменная», «Поле» и «Константа»
- •1. Понятие «Переменная»
- •2. Инициализация переменной
- •3. Динамическая инициализация
- •4. Неявно типизированные переменные
- •5. Понятие «Поле»
- •6. Понятие «Константа»
- •3.4.3. Область видимости типов переменных Область видимости типов переменных
- •1. Область видимости типов переменных
- •2. Конфликты областей видимости локальных переменных
- •3. Конфликты областей видимости полей и локальных переменных
- •3.4.4. Основные сведения о типах данных Основные сведения о типах данных
- •1. Типы данных
- •2. Задание типов в объявляемых параметрах
- •3. Встроенные типы
- •4. Пользовательские типы
- •5. Система общих типов cst
- •6. Типы значений
- •7. Целочисленные типы
- •8. Типы с плавающей запятой
- •8.Десятичный тип данных
- •10. Символьный тип
- •12. Логический тип данных
- •13. Ссылочные типы
- •14. Типы литеральных значений
- •15. Универсальные типы
- •16. Неявные типы, анонимные типы и типы допускающие значение null
- •3.4.5. Понятие «Литералы» Понятие «Литерал»
- •1. Понятие «Литерал»
- •2. Шестнадцатеричные литералы
- •3. Управляющие последовательности символов
- •4. Строковые литералы
- •3.4.6. Преобразование типов данных Преобразование типов данных
- •1. Виды преобразования типов данных
- •2.Неявные преобразования
- •3. Явные преобразования
- •3. Дополнительные сведения
- •4. Автоматическое преобразование типов
- •5. Приведение несовместимых типов
- •6. Перехват сужающих преобразований данных
- •7. Настройка проверки на предмет возникновения условий переполнения в масштабах проекта
- •8. Роль класса System.Convert
- •9. Исключения преобразования типов во время выполнения
- •3.5. Основные ключевые слова, операторы и выражения
- •3.5.1. Справочные таблицы по ключевым словам (со ссылками на msdn) Справочные таблицы по всем ключевым словам (со ссылками на msdn)
- •1. Основные ключевые слова и операторы
- •2. Контекстные ключевые слова
- •3. Основные ключевые слова операторов
- •4. Основные ключевые слова параметров методов
- •5. Основные ключевые слова модификаторов доступа
- •6. Ключевые слова, используемые для пространств имён
- •7. Различные ключевые слова
- •8. Ключевые слова преобразований
- •9. Ключевые слова запроса
- •10. Буквенные ключевые слова
- •3.5.2. Операторы, типы операторов, выражения и виды операторов Операторы, типы операторов, выражения и виды выражений
- •1. Справочная таблица операторов по категориям (со ссылками на msdn)
- •2. Типы операторов
- •3. Внедрённые операторы
- •4. Вложенные блоки операторов
- •5. Недостижимые операторы
- •6. Выражения
- •7. Значения выражений
- •8. Арифметическое переполнение
- •9. Приоритет и ассоциативность операторов
- •10. Литералы и простые имена
- •11. Выражения вызова
- •12. Выражения запросов
- •13. Лямбда-выражения
- •14. Деревья выражений
- •3.5.3. Операторы, вычисление значения и приоритет операторов Операторы, вычисление значения и приоритет оператора
- •1. Понятие «Оператор»
- •2. Операторы, вычисление значения и приоритет операторов
- •3. Основные операторы
- •9. Операторы равенства
- •10. Логические, условные операторы и null-операторы
- •11. Операторы назначения и анонимные операторы
- •12. Ассоциативность
- •13. Добавление скобок
- •14. Перегрузка операторов
- •15. Операторы преобразования
- •3.5.4. Применение операторов: арифметические операторы Применение операторов: арифметические операторы
- •1. Арифметические операторы
- •2. Операторы инкремента и декремента
- •3.5.5. Применение операторов: отношения и логические операторы Применение операторов: отношения и логические операторы
- •2. Укороченные логические операторы
- •3.5.6. Применение операторов: операторы присваивания Применение операторов: операторы присваивания
- •1. Операторы присваивания
- •2. Составные операторы присваивания
- •3.5.7. Применение операторов: поразрядные операторы Применение операторов: поразрядные операторы
- •1. Поразрядные операторы
- •2. Поразрядные операторы и, или, исключающее или и не
- •3. Операторы сдвига
- •3.5.8. Применение операторов: тернарный оператор Применение операторов: тернарный оператор
- •3.5.9. Применение операторов: «if» и «switch» Применение операторов: «if» и «switch»
- •1. Условные операторы
- •2. Оператор if
- •2. Оператор switch
- •3.5.10. Применение операторов: «for» и «while» Применение операторов: «for» и «while»
- •1. Операторы циклов
- •2. Цикл for
- •3. Цикл while
- •3.5.11. Применение операторов: «do-while» и «foreach» Применение операторов: «do-while» и «foreach»
- •1. Цикл do-while
- •2. Цикл foreach
- •3.5.12. Применение операторов: «goto», «break» и «continue» Применение операторов: «goto», «break» и «continue»
- •1. Операторы перехода
- •2.Оператор goto
- •3. Оператор break
- •4. Оператор continue
- •5. Оператор return
- •3.6. Понятие «Класс», «Структура», «Объект» и «Индексатор»
- •3.6.1. О классах, структурах и понятие «Модификатор доступа» о классах, структурах и понятие «Модификатор доступа»
- •1. О классах и структурах
- •2. Понятие «модификатор доступа»
- •3. Доступность класса и структуры
- •4. Доступность члена класса и структуры
- •5. Другие типы
- •3.6.2. Понятие «Класс» и «Статический класс» Понятие «Класс» и «Статический класс»
- •1. Понятие «класс»
- •2. Объявление классов
- •3. Создание экземпляра класса
- •4. Наследование классов
- •5. Конструкторы экземпляра класса и статические члены класса
- •6. Понятие «Статический класс»
- •7. Деструкторы экземпляра класса
- •8. И ещё немного о классах и их использовании...
- •3.6.3. Вложенные классы и понятие «Вложенные типы» Вложенные классы и понятие «Вложенные типы»
- •1. Вложенные классы
- •2. Понятие «Вложенные типы»
- •3.6.4. Понятие «Абстрактный класс», «Запечатанный класс» и «Разделяемые классы» и «Разделяемые методы» Понятие «Абстрактный класс», «Запечатанный класс» и «Разделяемые классы» и «Разделяемые методы»
- •1. Понятие «Абстрактный класс»
- •2. Понятие «Запечатанный класс»
- •3. Понятие «Разделяемый класс»
- •4. Понятие «Разделяемые методы»
- •3.6.5. Понятие «Структура» Понятие «Структура»
- •3.6.6. Понятие «Объект» Понятие «Объект»
- •1. Понятие «Объект»
- •2. Экземпляры классов в сравнении с экземплярами классов
- •3. Идентификация и равенство значений
- •3.6.7. Понятие «Индексатор» Понятие «Индексатор»
- •1. Понятие «Индексатор»
- •2. Использование индексаторов
- •3. Индексаторы в интерфейсах
- •4. Сравнение свойств и индексаторов
- •3.7. Понятие «Метод» и «Свойство»
- •3.7.1. Понятие «Метод» Понятие «Метод»
- •1. Понятие «Метод»
- •2. Сигнатура метода
- •3. Доступ к методам
- •4. Параметры метода и аргументы
- •5. Передача аргументов по значению и передача по ссылке
- •6. Возвращаемые значения
- •3.7.2. Метод: именованные и необязательные аргументы Метод: именованные и необязательные аргументы
- •3.7.3. Метод: процедура или функция?! Метод: процедура или функция?!
- •3.7.4. Метод: рекурсия Метод: рекурсия
- •3.7.5. Понятие «Свойство» Понятие «Свойство»
- •1. Понятие «Свойство»
- •2. Метод доступа get для свойства
- •3. Метод доступа set для свойства
- •4. Свойства интерфейса
- •5. Автоматически реализуемые свойства
- •3.7.6. Свойство: модификаторы доступа в аксессорах Свойство: модификаторы доступа в аксессорах
- •3.8. Понятие «Массив», «Строка», «Кортеж» и «Перечисление»
- •3.8.1. Понятие «Массив» Понятие «Массив»
- •1. Понятие «Массив»
- •2. Массивы как объекты
- •3. Использование оператора foreach
- •3.8.2. Виды массивов Виды массивов
- •1. Одномерный массив
- •2. Передача одномерных массивов в качестве аргументов
- •3. Массивы типов значений и ссылочных типов
- •4. Многомерный массив
- •5. Передача многомерных массивов в качестве аргументов
- •6. Массивы массивов (ступенчатый или зубчатый массив)
- •7. Неявно типизированные массивы
- •8. Передача массивов при помощи параметров ref и out
- •3.8.3. Класс «Array» Класс «Array»
- •1. Класс «Array»
- •2. Создание массивов
- •3. Копирование массивов
- •4.Сортировка и поиск
- •3.8.4. Понятие «Кортеж» Понятие «Кортеж»
- •3.8.5. Понятие «Строка» Понятие «Строка»
- •1. Понятие «Строка»
- •2. Построение строк
- •3. Работа со строками
- •4. Постоянство строк
- •3.8.6. Класс «StringBuilder» Класс «StringBuilder»
- •3.8.7. Форматирующие строки Форматирующие строки
- •1. Форматирующие строки
- •2. Форматирование даты и времени
- •3.8.8. Регулярные выражения Регулярные выражения
- •1. Регулярные выражения
- •2. Введение в регулярные выражения
- •3.8.9. Понятие «Перечисление» Понятие «Перечисление»
- •3.9. Понятие «Интерфейс» Понятие «Интерфейс»
- •1. Понятие «Интерфейс»
- •2. Явная реализация интерфейса
- •3. Интерфейс или абстрактный класс?
- •3.10. Основы работы с исключениями
- •3.10.1. Понятие «Исключение» Понятие «Исключение»
- •1. Ошибки и исключения
- •2. Роль обработки исключений в .Net
- •3. Составляющие процесса обработки исключений в .Net
- •3.10.2. Перехват исключений Перехват исключения
- •1. Основы работы с исключениями
- •2. Блок try-catch
- •3. Последствия «не перехвата» исключений
- •3.10.3. Класс «Exception» Класс «Exception»
- •1. Класс «Exception»
- •2. Конфигурирование состояние исключений
- •3.10.4. Исключения уровня системы и приложения Исключения уровня системы и приложения
- •1. Исключения уровня системы (System.SystemException)
- •2. Исключения уровня приложения (System.ApplicationException)
- •3. Создание специальных исключений
- •3.10.5. Обработка многочисленных исключений Обработка многочисленных исключений
- •1. Применение нескольких операторов catch
- •2. Перехват всех исключений
- •4. Вложение блоков try
- •3.10.6. Операторы «throw» и «finally» Операторы «throw» и «finally»
- •1. Оператор «throw»
- •2. Повторное генерирование исключений
- •3. Оператор «finally»
- •3.10.7. Исключения «повреждённого состояния», а также «checked» и «unchecked» Исключения «повреждённого состояния», а также «checked» и «unchecked»
- •1. Исключения, связанные с поврежденным состоянием (Corrupted State Exceptions)
- •2. Ключевые слова «checked» и «unchecked»
- •3.11. Понятие «Делегат», «Лямбда-выражение» и «Событие»
- •3.11.1. Понятие «Делегат» Понятие «Делегат»
- •1. Понятие «Делегат»
- •2. Определение типа делегата в с#
- •3. Базовые классы «System.MulticastDelegate» и «System.Delegate»
- •4. Групповое преобразование делегируемых методов
- •5. Применение методов экземпляра в качестве делегатов
- •6. Групповая адресация
- •3.11.2. Делегаты: ковариантность и контравариантность делегатов Делегаты: ковариантность и контравариантность делегатов
- •3.11.4. Делегаты: анонимные методы Делегаты: анонимные методы
- •3.11.5. Понятие «Лямбда-выражение» Понятие «Лямбда-выражение»
- •1. Понятие «Лямбда-выражение»
- •2. Одиночные лямбда-выражения
- •3. Блочные лямбда-выражения
- •3.11.6. Понятие «Событие» Понятие «Событие»
- •1. Понятие «Событие»
- •2. «Аксессоры» событий
- •3.11.7. События: пример обработки событий События: пример обработки событий
- •Глава 4. Расширенные возможности программирования на языке c#
- •4.1. Препроцессорные директивы в c# Препроцессорные директивы в c#
- •4.2. Понятие «Перезагрузка»
- •4.2.1. Перезагрузка методов Перезагрузка методов
- •4.2.2. Перезагрузка конструкторов Перезагрузка конструкторов
- •4.2.3. Перезагрузка индексаторов Перезагрузка индексаторов
- •4.2.4. Перезагрузка операторов Перезагрузка операторов
- •1. Основы перезагрузки операторов
- •2. Перегрузка бинарных операторов
- •3. Перегрузка унарных операторов
- •4. Выполнение операций со встроенными в с# типами данных
- •4.2.5. Перегрузка операторов отношения и операторов «true» и «false» Перегрузка операторов отношения и операторов «true» и «false»
- •1. Перегрузка операторов отношения
- •2. Перегрузка операторов true и false
- •4.2.6. Перегрузка логических операторов Перегрузка логических операторов
- •1. Перезагрузка логических операторов
- •2. Перегрузка укороченных логических операторов
- •4.2.7. Ещё раз об операторах преобразования Ещё раз об операторах преобразования
- •4.3. Наследование и полиморфизм
- •4.3.1. Основы наследования Основы наследования
- •4.3.2. Защищенный доступ и исключение наследования Защищенный доступ и исключение наследования
- •1. Организация защищенного доступа
- •2. Ключевое слово sealed
- •3. Диаграммы классов среды разработки Visual Studio 2010
- •4.3.3. Конструкторы и наследование Конструкторы и наследование
- •1. Ссылки на базовый класс и объекты производных классов
- •4.3.4. Ссылки на базовый класс и объекты производных классов Ссылки на базовый класс и объекты производных классов
- •1. Ссылки на базовый класс и объекты производных классов
- •2. Применение ключевого слова base для доступа к скрытому имени
- •4.3.5. Ссылки на базовый класс и объекты производных классов Ссылки на базовый класс и объекты производных классов
- •4.3.6. Виртуальные методы, свойства и индексаторы Виртуальные методы, свойства и индексаторы
- •4.3.7. Абстрактные классы Абстрактные классы
- •Глава 5. Интегрированная среда разработки microsoft visual studio 2010
- •5.1. Типы приложений для проектов группы Visual c# Типы приложения для проектов группы Visual c#
- •1. Типы приложений в окне «Создать проект» группы Visual c#
- •1. Консольное приложение
- •3. Приложение Windows Forms
- •4. Приложение wpf (Windows Presentation Foundation)
- •5. Служба Windows
- •6. Приложение службы wcf (Windows Communication Foundation)
- •7. Windows Workflow Foundation (wf)
- •5.2. Основы работы со средой разработки Visual Studio 2010 Основы работы со средой разработки Visual Studio 2010
- •5.3. Создание проекта в среде разработки Visual Studio 2010 Создание проекта в среде разработки Visual Studio 2010
- •1. Создание нового проекта
- •2. Утилита «Обозреватель решение» («Solution Explorer»)
- •3. Добавление ссылок на внешние сборки
- •4. Просмотр свойств проекта
- •5. Утилита «Обозреватель объектов» («Object Browser»)
- •6. Отличие проектов от решений
- •5.4. Изучение проекта и заполнение файлов проекта кодом Изучение проекта и заполнение файлов проекта кодом
- •1. Редактор с возможностью сворачивания блоков кода
- •2. Окно «Конструктор» («Design View»)
- •3. Окно «Свойства» («Properties»)
- •4. Окно «Окно классов» («Class View»)
- •5.5. Управление и компоновка проекта Управление и компоновка проекта
- •1. Компоновка, компиляция и построение проекта
- •2. Оптимизация
- •3. Выбор конфигурации
- •4. Редактирование конфигураций
- •5.6. Отладка кода проекта Отладка кода проекта
- •1. Компоновка, компиляция и построение проекта
- •5.7. Рефакторинг и расширение кода проекта Рефакторинг и расширение кода
- •1. Рефакторинг кода проекта
- •2. Расширение кода проекта
- •5.8. Конструктор классов Конструктор классов
- •5.9. Встроенная справочная система Встроенная справочная система
- •Глоссарий терминов
- •1. Термины от а до я
- •2. Термина от a до z
- •IntelliSense
- •Visual InterDev
4. Понятие «Разделяемые методы»
Разделяемый класс или структура могут содержать разделяемый метод. Одна часть класса содержит сигнатуру метода. В той же или в другой части можно определить дополнительную реализацию. Если реализация не предоставлена, то метод и все вызовы метода удаляются во время компиляции.
Разделяемые методы позволяют разработчику одной части класса определить метод, схожий с событием. Разработчик другой части класса может решить, реализовывать этот метод или нет. Если метод не реализован, то компилятор удаляет сигнатуру метода и все вызовы этого метода. Вызовы метода, включая любые результаты, которые могли бы произойти от оценки аргументов в вызовах, не имеют эффекта во время выполнения. Таким образом, любой код в разделяемом классе может свободно использовать разделяемый метод, даже если реализация не предоставлена. Во время компиляции и выполнения программы не возникнут никакие ошибки, если метод будет вызван, но не реализован.
Разделяемые методы особенно полезны для настройки автоматически созданного кода. Они позволяют зарезервировать имя и сигнатуру метода, чтобы автоматически созданный код мог вызвать метод, а разработчик мог сам решить, реализовывать этот метод или нет. Как и разделяемые классы, разделяемые методы позволяют организовать совместную работу автоматически созданного кода и кода, созданного человеком, без дополнительных затрат во время выполнения.
Объявление разделяемого метода состоит из двух частей: определения и реализации. Они могут находиться в разных частях или в одной и той же части разделяемого класса. Если объявление реализации отсутствует, то компилятор оптимизирует код, удаляя как объявление определения, так и все вызовы метода. Пример:
// Файл file1.cs
partial void onNameChanged();
// Файл file2.cs
partial void onNameChanged()
{
// Тело метода
}
Некоторые особенности при работе с такими методами:
Объявления разделяемого метода должны начинаться с контекстно-зависимого ключевого слова partial, а метод должен возвращать значение типа void.
Разделяемые методы могут иметь параметры ref, но не могут иметь параметры out.
Разделяемые методы неявно имеют модификатор private и поэтому не могут иметь модификатор virtual.
Разделяемые методы не могут иметь модификатор extern, поскольку наличие тела определяет, выполняется ли их определение или реализация.
Разделяемые методы могут иметь модификаторы static и unsafe.
Разделяемые типы могут быть универсальными. Ограничения помещаются в ту часть объявления разделяемого метода, где находится определение, и могут дополнительно повторяться в разделе реализации. Имена параметров и типов параметров необязательно должны совпадать в объявлении реализации и в объявлении определения.
Можно использовать делегат в качестве определенного и реализованного разделяемого метода, но его нельзя использовать в качестве разделяемого метода, который только определен.
3.6.5. Понятие «Структура» Понятие «Структура»
Структура — это фактически объект с «данными», является типом значения и не является классом (класс — это ссылочный тип). Структуры определяются с помощью ключевого слова struct, например:
public struct PostalAddress
{
// Свойства, методы, события, поля (переменные) и прочее...
}
Структуры используют большую часть того же синтаксиса, что и классы, однако они более ограничены по сравнению с последними:
В объявлении структуры поля не могут быть инициализированы до тех пор, пока они будут объявлены как постоянные или статические.
Структура не может объявлять используемый по умолчанию конструктор (конструктор без параметров) или деструктор.
Структуры копируются при присваивании. При присваивании структуры к новой переменной выполняется копирование всех данных, а любое изменение новой копии не влияет на данные в исходной копии. Это важно помнить при работе с коллекциями типов значений, такими как Dictionary<string, myStruct>.
Структуры являются типами значений, а классы — ссылочными типами.
В отличие то классов, структуры можно создавать без использования оператора new.
Структуры могут объявлять конструкторы, имеющие параметры.
Структура не может быть унаследованной от другой структуры или класса и не может быть основой для других классов. Все структуры наследуют непосредственно от System.ValueType, который наследует от System.Object.
Структуры могут реализовывать интерфейсы.
Структура может использоваться как тип, допускающий значение NULL, и ей можно назначить значение NULL.
Тип struct подходит для создания несложных объектов, таких как Point, Rectangle и Color. Хотя точку удобно представить в виде класса с автоматически реализуемыми свойствами, в некоторых сценариях структура может оказаться более эффективной. Например, при объявлении массива из 1000 объектов Point потребуется выделить дополнительную память для хранения ссылок на все эти объекты, и структура в таком случае будет более экономичным решением. Поскольку .NET Framework уже содержит объект с именем Point, структура в данном примере называется вместо этого «CoOrds»:
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
Определение конструктора по умолчанию (без параметров) для структуры является ошибкой. Ошибкой также является инициализация поля экземпляра в основной части структуры. Можно инициализировать члены структуры с помощью параметризованного конструктора или путем доступа к членам по отдельности после объявления структуры. Любые закрытые или в ином случае недоступные члены можно инициализировать только в конструкторе.
При создании объекта структуры с помощью оператора new объект, создаётся и вызывается соответствующий конструктор. В отличие то классов структуры можно создавать без использования оператора new. В таком случае вызов конструктора отсутствует, что делает выделение более эффективным. Однако поля остаются без значений и объект нельзя использовать до инициализации всех полей.
Когда структура содержит ссылочный тип в качестве члена, конструктор по умолчанию члена должен вызываться явно, в противном случае член останется без значений и структура не сможет использоваться (возникнет ошибка компилятора).
В отличие от классов структуры не поддерживают наследование. Структура не может быть унаследованной от другой структуры или класса и не может быть основой для других классов. Однако структуры наследуют от базового класса Object. Структуры могут реализовывать интерфейсы; этот механизм полностью аналогичен реализации интерфейсов для классов.
Класс нельзя объявить с помощью ключевого слова struct.
Пример использования код структуры «CoOrds». В этом примере демонстрируется инициализация struct с помощью конструктора по умолчанию и с помощью конструктора с параметрами:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LC_Console
{
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Инициализируем и декларируем объекты структуры
class TestCoOrds
{
static void Main()
{
// Инициализируем
CoOrds coords1;
coords1.x = 10;
coords1.y = 20;
CoOrds coords2 = new CoOrds(10, 10);
// Выводим результат
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
Console.Write("CoOrds 2: ");
Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
// Keep the console window open in debug mode.
Console.WriteLine("Для продолжения нажмите любую клавишу . . .");
Console.ReadKey();
}
}
}
/* Выведет:
* CoOrds 1: x = 10, y = 20
* CoOrds 2: x = 10, y = 10
* Для продолжения нажмите любую клавишу . . .
*/
В коде выше описаны оба случая использования инициализации члена структуры. С new и без.