- •А.А. Волосевич
- •Содержание
- •1. Работа с числами
- •2. Представление даты и времени
- •3. Работа со строками и текстом
- •4. Преобразование информации
- •5. Сравнение для выяснения равенства
- •6. Сравнение для выяснения порядка
- •7. Жизненный цикл объектов
- •7.1. Алгоритм сборки мусора
- •7.2. Финализаторы и интерфейс iDisposable
- •7.3. Слабые ссылки
- •8. Перечислители и итераторы
- •9. Стандартные интерфейсы коллекций
- •10. Массивы и класс System.Array
- •11. Типы для работы с коллекциями-списками
- •12. Типы для работы с коллекциями-множествами
- •13. Типы для работы с коллекциями-словарями
- •14. Типы для создания пользовательских коллекций
- •15. Технология linq to Objects
- •1. Оператор условия Where().
- •2. Операторы проекций.
- •3. Операторы упорядочивания.
- •4. Оператор группировки GroupBy().
- •5. Операторы соединения.
- •6. Операторы работы с множествами.
- •7. Операторы агрегирования.
- •8. Операторы генерирования.
- •9. Операторы кванторов и сравнения.
- •10. Операторы разбиения.
- •11. Операторы элемента.
- •12. Операторы преобразования.
- •16. Работа с объектами файловой системы
- •17. Ввод и вывод информации
- •17.1. Потоки данных и декораторы потоков
- •2. Классы для работы с потоками, связанными с хранилищами.
- •3. Декораторы потоков.
- •4. Адаптеры потоков.
- •17.2. Адаптеры потоков
- •18. Основы xml
- •19. Технология linq to xml
- •20. Дополнительные возможности обработки xml
- •21. Сериализация времени выполнения
- •22. Контракты данных и xml-сериализация
- •23. Состав и взаимодействие сборок
- •24. Метаданные и получение информации о типах
- •25. Позднее связывание и кодогенерация
- •26. Атрибуты
- •27. Динамическое связывание
- •28. Файлы конфигурации
- •29. Диагностика и мониторинг
- •30. Процессы и домены
- •31. Основы многопоточного программирования
- •32. Синхронизация потоков
- •32.1. Критические секции
- •32.2. Синхронизация на основе подачи сигналов
- •32.3. Неблокирующие средства синхронизации
- •32.4. Разделение данных между потоками
- •33. Библиотека параллельных задач
- •33.1. Параллелизм на уровне задач
- •33.2. Параллелизм при императивной обработке данных
- •33.3. Параллелизм при декларативной обработке данных
- •33.4. Обработка исключений и отмена выполнения задач
- •33.5. Коллекции, поддерживающие параллелизм
- •34. Асинхронный вызов методов
- •Литература
2. Представление даты и времени
В пространстве имён System определены три неизменяемые структуры для работы с датой и временем: TimeSpan, DateTime и DateTimeOffset.
Структура TimeSpan хранит интервал времени в виде отсчётов по 100 наносекунд. Для создания экземпляра структуры можно использовать один из её конструкторов, статические методы вида TimeSpan.FromЕдиницыВремени() или разность двух переменных типа DateTime.
var ts1 = new TimeSpan(50); // количество отсчётов по 100 нс
var ts2 = new TimeSpan(1, 20, 50); // часы, минуты, секунды
var ts3 = TimeSpan.FromHours(3.5);
Структура TimeSpan перегружает операции сравнения и аддитивные операции. Свойства TimeSpan позволяют обратиться либо к отдельному временному компоненту интервала (свойства Days, Hours, Minutes, Seconds, Milliseconds), либо выразить весь интервал через указанную единицу времени (TotalDays, TotalHours и т.п.).
TimeSpan ts = TimeSpan.FromDays(10) - TimeSpan.FromSeconds(1);
Console.WriteLine(ts.Days); // 9
Console.WriteLine(ts.Seconds); // 59
Console.WriteLine(ts.TotalDays); // 9.99998842592593
Структуры DateTime и DateTimeOffset предназначены для хранения даты и времени. Интервал дат – от 1 января 1 года до 31 декабря 9999 года, точность времени – 100 наносекунд. DateTimeOffset дополнительно хранит смещение всемирного координированного времени (UTC offset), что даёт возможность правильно сравнивать даты разных часовых поясов.
Структура DateTime имеет конструкторы, позволяющие указать для создаваемого экземпляра год, месяц, день, часы, минуты, секунды, миллисекунды. Дополнительно можно задать аргумент из перечисления DateTimeKind, который показывает, какое именно время содержит экземпляр (Unspecified, Local, Utc). Также можно задать используемый датой календарь – это влияет на алгоритм вычисления некоторых свойств даты. Конструкторы структуры DateTimeOffset дополнительно разрешают указать смещение UTC как значение TimeSpan (целое количество минут).
var dt1 = new DateTime(2012, 12, 21);
var dt2 = new DateTime(2012, 12, 21, 12, 0, 0, DateTimeKind.Local);
var dt3 = new DateTime(2012, 12, 21, new PersianCalendar());
var dto = new DateTimeOffset(dt1, TimeSpan.FromHours(-6));
Определено неявное преобразование DateTime к DateTimeOffset. Такие свойства структуры DateTimeOffset как UtcDateTime, LocalDateTime, DateTime дают возможность получить значение времени UTC в виде DateTime.
Используя DateTime и DateTimeOffset, текущее время и дату можно узнать при помощи свойств Now, Today, UtcNow. Обе структуры содержат свойства для чтения отдельных временных компонентов, а также методы для увеличения временных компонент на указанную (возможно, отрицательную) величину. Структуры DateTime и DateTimeOffset также перегружают операции сравнения и аддитивные операции.
var dt = DateTime.Today; // текущая дата (без времени)
Console.WriteLine(dt.Month); // узнаем текущий месяц
Console.WriteLine(dt.DayOfWeek); // и день недели
var changed_dt = dt.AddDays(-3.5);
DateTimeOffset dto = DateTime.Now; // неявное преобразование
Console.WriteLine(dto.Offset); // узнаем UTC offset