- •Оглавление
- •Метод Main
- •Ввод и вывод
- •Компиляция и выполнение
- •Общая структура программы на c#
- •Main() и аргументы командной строки
- •Общие сведения
- •Аргументы командной строки
- •Отображение аргументов командной строки
- •Доступ к аргументам командной строки с помощью оператора "foreach"
- •Значения, возвращаемые методом Main()
- •Пример результатов выполнения
- •Общие сведения о типах данных
- •Приведение
- •Результат
- •Упаковка-преобразование и распаковка-преобразование3
- •Производительность
- •Упаковка-преобразование4
- •Описание5
- •Результат
- •Распаковка-преобразование6
- •Описание7
- •Результат
- •Преобразование массива байтов в значение типа "int"8
- •Пример9
- •Преобразование строки в значение типа "int"
- •Преобразование шестнадцатеричных строк10
- •Массивы
- •Общие сведения о массивах
- •Массивы как объекты
- •Результат
- •Одномерные массив
- •Массивы типов значений и ссылочных типов.
- •Многомерные массивы
- •Инициализация массива
- •Массивы массивов
- •Результат
- •Использование оператора foreach с массивами
- •Передача массивов в качестве параметров
- •Передача одномерных массивов в качестве параметров
- •Пример 1 Описание
- •Результат 1
- •Передача многомерных массивов в качестве параметров
- •Пример 2 Описание
- •Передача массивов при помощи параметров ref и out
- •Пример 1
- •Пример 2
- •Неявно типизированные массивы11
- •Неявно типизированные массивы в инициализаторах объектов12
- •Использование строк
- •Работа со строками Escape-знаки
- •Точные строки: символ @
- •Доступ к отдельным знакам
- •Смена регистра
- •Сравнения
- •Разделение строки на подстроки
- •Строки с нулевыми значениями и пустые строки
- •Использование класса StringBuilder13
- •Анализ строк с помощью метода разделения
- •Навигация по содержимому строки с помощью строковых методов
- •Анализ строк с помощью регулярных выражений14
- •Объединение нескольких строк
- •Изменение содержимого строки
- •Определение наличия числового значения в строке
- •Надежное программирование
- •Безопасность
- •Базовые типы кодировки
- •Типы форматирования
- •Общие сведения о форматировании
- •Описатели формата
- •Анализ и описатели формата
- •Метод ToString и описатели формата
- •Поставщики формата15
- •Составное форматирование
- •Форматирование базовых типов
- •Форматирование для различных языков и региональных параметров16
- •Составное форматирование
- •Строка составного формата
- •Синтаксис элементов форматирования
- •Выравнивание
- •Компонент строки формата
- •Оформление фигурных скобок17
- •Порядок обработки18
- •Примеры кода
- •Строки числовых форматов
- •Строки стандартных числовых форматов
- •Примечания Настройки панели управления
- •Свойства NumberFormatInfo
- •Целочисленные типы и типы с плавающей запятой
- •Бесконечности действительных чисел с плавающей запятой и NaN
- •Строки настраиваемых числовых форматов19
- •Примечания Бесконечности действительных чисел с плавающей запятой и NaN
- •Настройки панели управления
- •Строки формата с фиксированной запятой и округлением
- •Разделители секций и условное форматирование20
- •Два примера настраиваемых форматов
- •Регулярные выражения в .Net Framework
- •Регулярные выражения как язык
- •Escape-знаки
- •Выполнение действия со строками с помощью основных строковых операций
- •Разбор строк
- •Разбор числовых строк
- •Операторы и выражения
- •Операторы
- •Выражения
- •Литералы и простые имена
- •Выражения вызова
- •Операторы
- •Анонимные функции
- •Эволюция делегатов в c#
- •Лямбда-выражения22
- •Выражения-лямбды
- •Лямбды операторов
- •Лямбды со стандартными операторами запросов
- •Вывод типа в лямбда-выражениях
- •Область действия переменной в лямбда-выражениях
- •Использование лямбда-выражений вне linq
- •Анонимные методы
- •Заметки
- •Перегружаемые операторы
- •Операторы преобразования23
- •Общие сведения об операторах преобразования
- •Использование операторов преобразования
- •Пример 1 Описание
- •Результат 1
- •Пример 2 Описание
- •Результат 2
- •Реализация определенных пользователем преобразований между структурами
- •Надежное программирование
- •Перегрузка операторов для реализации класса комплексных чисел
- •Переопределение Equals
- •Объекты, классы и структуры
- •Интерфейсы
- •Универсальные типы
- •Статические типы
- •Объекты
- •Экземпляры структуры и экземпляры класса
- •Идентификация объекта и идентификация значения26
- •Объявление классов
- •Создание объектов
- •Наследование классов
- •Описание
- •Результат
- •Общие сведения о классах
- •Структуры
- •Общие сведения о структурах
- •Использование структур
- •Пример 1 Описание
- •Результат
- •Пример 2 Описание
- •Результат
- •Наследование
- •Абстрактные и запечатанные классы и члены классов
- •Абстрактные классы и члены классов
- •Запечатанные классы и члены классов
- •Определение абстрактных свойств
- •Полиморфизм
- •Общие сведения о полиморфизме
- •Управление версиями с помощью ключевых слов "Override" и "New"
- •Переопределение и выбор метода29
- •Использование ключевых слов "Override" и "New"
- •Переопределение метода ToString
- •Порядок переопределения метода OnString в классе или структуре
- •Интерфейсы
- •Общие сведения об интерфейсах
- •Явная реализация интерфейса33
- •Явная реализация членов интерфейса
- •Надежное программирование
- •Явная реализация членов интерфейса с наследованием
- •Надежное программирование
- •Параметры методов
- •Возвращаемые значения
- •Передача параметров
- •Передача параметров типа значения
- •Пример. Передача типов значений с помощью значения.
- •Пример. Передача типов значений с помощью ссылки.
- •Пример. Замена типов значений.
- •Передача параметров ссылочного типа
- •Пример. Передача ссылочных типов по значению
- •Результат
- •Рассмотрение кода
- •Пример. Передача ссылочных типов по ссылке
- •Результат
- •Рассмотрение кода
- •Пример. Перестановка двух строк
- •Результат
- •Рассмотрение кода
- •Конструкторы
- •Использование конструкторов
- •Конструкторы экземпляров
- •Пример 1
- •Результат
- •Пример 2
- •Результат
- •Пример 3
- •Результат
- •Закрытые конструкторы35
- •Результат
- •Статические конструкторы36
- •Результат
- •Создание конструктора копии
- •Деструкторы
- •Заметки
- •Использование деструкторов для освобождения ресурсов.
- •Высвобождение ресурсов явным образом
- •Результат
- •Инициализаторы объектов и коллекций
- •Инициализаторы объектов и анонимные типы37
- •Инициализаторы объектов и типы, допускающие значение null
- •Инициализаторы коллекций
- •Инициализация объектов без вызова конструктора
- •Компиляция кода38
- •Инициализация словаря с помощью инициализатора коллекции39
- •Компиляция кода
- •Константы
- •Вложенные типы
- •Модификаторы доступа
- •Доступность класса и структуры
- •Доступность члена класса и структуры
- •Другие типы
- •Разделяемые классы и методы40
- •Разделяемый класс
- •Ограничения
- •Пример 1 Описание
- •Результат
- •Пример 2 Описание
- •Разделяемые методы
- •Статические классы и члены статических классов
- •Статические классы
- •Когда следует использовать статические классы
- •Статические члены
- •Входные данные
- •Пример результатов выполнения.
- •Определение различия между передачей структуры и ссылки класса в метод
- •Анонимные типы41
- •Заметки
- •Возвращение поднаборов свойств элементов в запросе
- •Компиляция кода
- •Методы расширения
- •Неявно типизированные локальные переменные
- •Var и анонимные типы
- •Заметки
- •Свойства
- •Результат
- •Общие сведения о свойствах
- •Использование свойств
- •Метод доступа get
- •Метод доступа set
- •Заметки
- •Пример 1 Описание
- •Результат 1 Employee number: 101 Employee name: Claude Vige
- •Пример 2 Описание
- •Результат 2
- •Рассмотрение кода
- •Пример 3 Описание
- •Введенные данные
- •Результат 3
- •Свойства интерфейса
- •Пример результатов выполнения
- •Асимметричные методы доступа
- •Ограничения модификаторов доступа в методах доступа
- •Модификаторы доступа в переопределяющих методах доступа
- •Реализация интерфейсов
- •Домен доступности к методу доступа
- •Результат
- •Примечания
- •Объявление и использование свойств чтения и записи
- •Надежное программирование
- •Автоматически реализуемые свойства
- •Реализация облегченного класса с автоматически реализуемыми свойствами
- •Индексаторы
- •Общие сведения об индексаторах
- •Использование индексаторов
- •Заметки
- •Пример 1 Описание
- •Индексирование с использованием других значений
- •Пример 2 Описание
- •Результат
- •Надежное программирование
- •Индексаторы в интерфейсах
- •Результат
- •Сравнение свойств и индексаторов
- •Делегаты
- •Общие сведения о делегатах
- •Использование делегатов
- •Делегаты с именованными методами и делегаты с анонимными методами
- •Заметки
- •Пример 1
- •Результат
- •Пример 2
- •Результат
- •Использование делегатов вместо интерфейсов
- •Ковариация и контрвариация в делегатах
- •Пример 1 (ковариация) Описание
- •Пример 2 (контрвариация) Описание
- •Объединение делегатов (многоадресные делегаты)
- •Объявление, создание экземпляра и использование делегата
- •Надежное программирование
- •События
- •Общие сведения о событиях
- •Подписка и отмена подписки на события
- •Подписка на события в среде ide Visual Studio
- •Подписка на события программными средствами
- •Подписка на события при помощи анонимного метода
- •Отмена подписки
- •Отмена подписки на событие
- •Публикация событий, соответствующих рекомендациям .Net Framework
- •Порядок публикации событий, основанных на шаблоне EventHandler
- •Создание событий базового класса в производных классах
- •Вызов и прием событий
- •Реализация событий интерфейса
- •Реализация событий интерфейса в классе
- •Пример44
- •Использование словаря для хранения экземпляров событий
- •Универсальные шаблоны
- •Общие сведения об универсальных шаблонах
- •Введение в универсальные шаблоны
- •Преимущества универсальных шаблонов
- •Параметры универсального типа
- •Рекомендации по именованию параметра типа
- •Пространства имен
- •Общие сведения о пространствах имен
- •Использование пространств имен
- •Доступ к пространствам имен
- •Псевдонимы пространств имен
- •Использование пространств имен для управления областью действия
- •Полные имена
- •Использование квалификатора псевдонима пространства имен
- •Типы, допускающие значения null
- •Общие сведения о типах, допускающих значения null
- •Использование типов, допускающих значение null
- •Примеры допускающих значение null типов
- •Члены допускающих значение null типов
- •Явные преобразования
- •Неявные преобразования
- •Операторы
- •Оператор ??
- •Идентификация типа, допускающего значение null
- •Небезопасный код и указатели
- •Общие сведения о небезопасном коде
- •Буферы фиксированного размера
- •Заметки
- •Типы указателей45
- •Преобразования указателей
- •Неявные преобразования указателей
- •Явные преобразования указателей
- •Результат
- •Выражения указателей Получение значения переменной указателя
- •Получение адреса переменной
- •Доступ к члену с использованием указателя
- •Доступ к элементу массива с использованием указателя
- •Управление указателями Увеличение и уменьшение указателей
- •Арифметические операции над указателями
- •Сравнение указателей
- •Использование указателей для копирования массива байтов
- •Комментарии xml-документации
- •Рекомендуемые теги для комментариев документации
- •Использование xml-документации
- •Компиляция кода
- •Надежное программирование
- •Домены приложений
- •Общие сведения о доменах приложений
- •Выполнение кода в другом домене приложения
- •Сборки и глобальный кэш сборок
- •Общие сведения о сборках
- •Атрибуты
- •Общие сведения об атрибутах
- •Использование атрибутов
- •Общие атрибуты
- •Заметки
- •Использование нескольких идентификаторов
- •Атрибут Obsolete
- •Глобальные атрибуты
- •Исключения и обработка исключений
- •Общие сведения об исключениях
- •Использование исключений
- •Обработка исключений
- •Блоки catch
- •Блоки finally
- •Создание и генерация исключений
- •Чего следует избегать при генерации исключений
- •Определение классов исключений
- •Исключения, создаваемые компилятором
- •Обработка исключений с помощью блока try-catch
- •Примечания
- •Выполнение кода очистки с использованием блока finally
- •Взаимодействие
- •Использование вызова неуправляемого кода для воспроизведения звукового файла
- •Компиляция кода Чтобы скомпилировать этот код, выполните следующие действия47
- •Создание потоков
- •Общие сведения
- •Использование потоков
- •Синхронизация потоков
- •Ключевое слово lock
- •Мониторы
- •События синхронизации и дескрипторы ожидания
- •Мьютексные объекты
- •Создание и завершение потоков
- •Синхронизация потока-производителя и потока-потребителя
- •Использование пула потоков
- •Отражение
- •Общие сведения об отражении
- •Библиотеки c#
- •Создание и использование библиотек dll на языке c#
- •Выполнение
- •Результат
- •Компиляция кода
- •Безопасность
- •Рекомендации по безопасности, касающиеся языка c# в отдельности
- •Использование неуправляемых функций dll
- •Применение экспортированных функций dll
- •Подробный обзор вызова неуправляемого кода
- •Идентификация функций в библиотеках dll
- •Создание класса, содержащего функции dll
- •Создание прототипов в управляемом коде
- •Основы описания
- •Настройка описания
- •Задание точки входа
- •Вызов функции dll
- •Передача структур
- •Объявление и передача структур
- •Объявление и передача классов
- •Файловый и потоковый ввод-вывод
- •Основы файлового ввода-вывода
- •Классы, используемые в файловом вводе и выводе
- •Классы, используемые для чтения и записи в поток
- •Общие классы потокового ввода и вывода
- •Ввод-вывод и безопасность
- •Создание списка каталогов
- •Надежное программирование
- •Считывание из нового файла данных и запись в этот файл
- •Надежное программирование
- •Копирование каталогов
- •Открытие файла журнала и добавление в него данных
- •Запись текста в файл
- •Считывание текста из файла
- •Надежное программирование
- •Считывание символов из строки
- •Результат
- •Запись символов в строку
- •Надежное программирование
- •Добавление или удаление записей списка управления доступом
- •Чтобы добавить или удалить элемент списка управления доступом из файла
- •Чтобы добавить или удалить элемент acl из каталога
- •Компиляция кода
- •Сжатие файлов
- •Создание потоков
- •Создание класса Writer
- •Коллекции и структуры данных
- •Определение коллекций
- •Выбор класса коллекции
- •Знакомство с решениями, проектами и элементами
- •Контейнеры: проекты и решения
- •Элементы: файлы, ссылки, подключения к данным
- •Решения как контейнеры
- •Решения
- •Преимущества
- •Файлы определения
- •Проекты как контейнеры
- •Шаблоны проектов
- •Файлы проекта
- •Элементы проектов
- •Использование интегрированной среды разработки Visual c#
- •Введение в интегрированную среду разработки
- •Средства Visual c#
- •Доступ к средствам в интегрированной среде разработки
- •Окна редактора и конструктора форм Windows
- •Обозреватель решений и конструктор проектов
- •Окна компилятора, отладчика и списка ошибок
- •Настройка интегрированной среды разработки
- •Создание проекта
- •Создание нового проекта
- •Состав проекта Свойства
- •Ресурсы
- •Другие файлы исходного кода
- •Изменение свойств проекта
- •Создание пользовательского интерфейса
- •Добавление элементов управления
- •Задание свойств
- •Обработка событий
- •Редактирование кода
- •Списки завершения
- •Краткие сведения
- •Список членов
- •Сведения о параметрах
- •Добавление директив using
- •Оптимизация кода
- •Фрагменты кода
- •Подчеркивание волнистой линией
- •Средства обеспечения удобочитаемости кода Форматирование кода
- •Структура
- •Выделение цветом
- •Навигация и поиск
- •Представление классов
- •Навигация ctrl-tab
- •Панели переходов
- •Поиск в файлах
- •Обозреватель объектов
- •Стеки навигации
- •Построение и отладка
- •Параметры построения
- •Ошибки построения
- •Сравнение отладочной и выпускной конфигураций
- •Отладка
- •Моделирование и анализ кода
- •Конструктор классов
- •Обозреватель объектов
- •Метаданные как источник
- •Анализ управляемого кода
- •Добавление и редактирование ресурсов
- •Добавление ресурсов в проекты
- •Редактирование ресурсов
- •Компиляция ресурсов в сборки
- •Доступ к ресурсам во время выполнения
- •Получение справки
- •Локальная справка и справка в Интернете
- •Поиск по f1
- •Указатель
- •Содержание
- •Инструкции
- •Динамическая справка
- •Примеры
- •Оптимизация
- •Многопроектная оптимизация
- •Диалоговое окно "Предварительный просмотр изменений"
- •Допускающая наличие ошибок оптимизация
- •Извлечение метода
- •Оптимизация кода с помощью операции "извлечение метода"
- •Чтобы воспользоваться операцией "извлечение метода"
- •Переименовать
- •Операции переименования
- •Переименование идентификаторов
- •Чтобы переименовать идентификатор
- •Превращение локальной переменной в параметр
- •Заметки
- •Превращение локальной переменной в параметр
- •Чтобы выполнить превращение локальной переменной в параметр
- •Разметка кода цветом
- •Лексемы
- •Контекстные ключевые слова
- •Разметка цветом для обозначения парности фигурных скобок
- •Разметка цветом и жирным шрифтом
- •Разметка цветом и выделение цветным фоном
Работа со строками Escape-знаки
Строки могут содержать escape-знаки, такие как "\n" (новая строка) и "\t" (табуляция). Строка:
string hello = "Hello\nWorld!"; |
эквивалентна строке:
Hello
World!
Если требуется добавить в строку обратную косую черту, перед ней нужно поставить еще одну обратную косую черту. Следующая строка:
string filePath = "\\\\My Documents\\"; |
эквивалентна строке:
\\My
Documents\
Verbatim Strings: The @ Symbol
The @ symbol tells the string constructor to ignore escape characters and line breaks. The following two strings are therefore identical:
string p1 = "\\\\My Documents\\My Files\\"; string p2 = @"\\My Documents\My Files\"; |
In a verbatim string, you escape the double quotation mark character with a second double quotation mark character, as in the following example:
string s = @"You say ""goodbye"" and I say ""hello"""; |
Accessing Individual Characters
Individual characters that are contained in a string can be accessed by using methods such as SubString() and Replace().
string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2)); // outputs "C#" System.Console.WriteLine(s3.Replace("C#", "Basic")); // outputs "Visual Basic Express" |
It is also possible to copy the characters into a character array, as in the following example:
string s4 = "Hello, World"; char[] arr = s4.ToCharArray(0, s4.Length);
foreach (char c in arr) { System.Console.Write(c); // outputs "Hello, World" } |
Individual characters from a string can be accessed with an index, as in the following example:
string s5 = "Printing backwards"; for (int i = 0; i < s5.Length; i++) { System.Console.Write(s5[s5.Length - i - 1]); // outputs "sdrawkcab gnitnirP" } |
Точные строки: символ @
Символ @ служит для того, чтобы конструктор строк пропускал escape-знаки и переносы строки. Следующие две строки являются идентичными:
string p1 = "\\\\My Documents\\My Files\\"; string p2 = @"\\My Documents\My Files\"; |
Чтобы поставить в точной строке знак двойных кавычек, нужно использовать по два таких знака, как показано в следующем примере:
string s = @"You say ""goodbye"" and I say ""hello"""; |
Доступ к отдельным знакам
К отдельным знакам, содержащимся в строке, можно получить доступ с помощью таких методов как SubString() и Replace().
string s3 = "Visual C# Express"; System.Console.WriteLine(s3.Substring(7, 2)); // outputs "C#" System.Console.WriteLine(s3.Replace("C#", "Basic")); // outputs "Visual Basic Express" |
Также можно скопировать символы строки в массив символов, как показано в следующем примере.
string s4 = "Hello, World"; char[] arr = s4.ToCharArray(0, s4.Length);
foreach (char c in arr) { System.Console.Write(c); // outputs "Hello, World" } |
Доступ к отдельным знакам в строке возможен с помощью индекса, как показано в следующем примере.
string s5 = "Printing backwards"; for (int i = 0; i < s5.Length; i++) { System.Console.Write(s5[s5.Length - i - 1]); // outputs "sdrawkcab gnitnirP" } |
Changing Case
To change the letters in a string to uppercase or lowercase, use ToUpper() or ToLower(), as in the following example:
string s6 = "Battle of Hastings, 1066"; System.Console.WriteLine(s6.ToUpper()); // outputs "BATTLE OF HASTINGS 1066" System.Console.WriteLine(s6.ToLower()); // outputs "battle of hastings 1066" |
Comparisons
The simplest way to compare two strings is to use the == and != operators, which perform a case-sensitive comparison.
string color1 = "red"; string color2 = "green"; string color3 = "red"; if (color1 == color3) { System.Console.WriteLine("Equal"); } if (color1 != color2) { System.Console.WriteLine("Not equal"); } |
String objects also have a CompareTo() method that returns an integer value that is based on whether one string is less-than (<), equal to (==) or greater-than (>) another. When comparing strings, the Unicode value is used, and lowercase has a smaller value than uppercase. For more information about the rules for comparing strings, see CompareTo()()().
// Enter different values for string1 and string2 to // experiement with behavior of CompareTo string string1 = "ABC"; string string2 = "abc"; int result = string1.CompareTo(string2); if (result > 0) { System.Console.WriteLine("{0} is greater than {1}", string1, string2); } else if (result == 0) { System.Console.WriteLine("{0} is equal to {1}", string1, string2); } else if (result < 0) { System.Console.WriteLine("{0} is less than {1}", string1, string2); } // Outputs: ABC is less than abc |