Курс. NET
Орг. вопросы • Просьба тем кто не прислал входное задание в течении недели сделать его • След. Занятие – 25 числа • Включить камеру
Д. З. Срок – после лекции про SVN • Создать консольное приложение для ввода данных о каких-либо объектах. Сохранить информацию о них на диск. Загрузить информацию с диска. Если заданного файла нет – то загрузить из ресурсов. Варианты сохранения и загрузки – через потоки и через LINQ to XML (одновременно). Если файлы отличаются по содержимому при загрузке, вывести соответствующее сообщение и различие между файлами. Создать тесты для всего этого
Хорошая книга CLR via C#. Программирование на платформе Microsoft. NET Framework 4. 0 на языке C# Рихтер Дж.
Хорошая книга Догнать зайца. Как лидеры рынка выигрывают в конкурентной борьбе и как великие компании могут их настичь Стивен Спир Описывается методология Кайдзен
Поток • Поток – массив байт • Ресурсоемкий и блокирующий ресурс • Есть 3 основных варианта работы с потоками – Получение всех строк, которые в потоке – Получение всего содержимого потока в виде массива байт – Поэлементная обработка потока данных
Получение данных потока в виде массива байт • Суть решения – у потока есть свойство Length, которое показывает его размер • И есть методы для чтения и записи
Проблема освобождения потока • Использование using – стандартный ход
Получение строк из потока • get. File. Content. In. String. Array
Сериализация объекта в массив байт и обратно • Частая задача (вернее часто возникающий костыль) – необходимо очень по быстрому преобразовать объект в массив байт и обратно. Ручками. • Суть решения – использования Memory. Stream и сериализации. • Нормальное решение – преобразование в XML и обратно
Embedded Resource
Суть проблемы • Часто надо включить в программу не код – например скрипты обновления БД, эталонное содержимое пустого файла данных, шаблон документа и т. д. • Однако это не компилируемые объекты, поэтому один из вариантов – хранить рядом с библиотекой. – Минус – все люди ошибаются, потеряют или изменяют файл (особенно пользователи) • Решение – использовать Embedded Resource
Как его использовать • Включить нужный файл в проект • В Build Action выбрать Embedded Resource • Получить Embedded Resource в программе во время выполнения
LINQ to XML
Технологии работы с XML XDom LINQ to XML • Жуть • Счастье (появилось в. NET 3 и выше) • Основной недостаток – нет • Компоненты независимости между друг от друга элементами. Т. е. вы не можете создать элемент • Очень хорошая перегрузка без создания документа. преобразования в строку – собственно сам XML • Второй недостаток (для программиста) – очень плохая перегрузка преобразования в стороку
Задача: Продемонстрировать работу с LINQ to XML • • XDocument XAttribute XElement XComment • Есть список студентов в файле, который сделан в Excel. Надо преобразовать его в XML, удалить тех, которые встречаются дважды. Отсортировать по алфавиту и записать результат в виде XML в выходной файл
Главная проблема– файл Excel, загрузка данных • Решение 1 – добавить сервер автоматизации, открыть файл, открыть нужный лист, получить количество ячеек с данными, считать их.
Главная проблема – файл Excel, загрузка данных • Главное решение проблемы – презумпция «невиновности» программиста. Использование cvs – потому что он тоже поддерживается Excel. И если мы берем его формально мы выполняем требования что из Excel. Если заказчик настаивает – «пугаем» его необходимостью установки Excel (и следовательно платного Office) на все машины, где есть программа
Главная проблема - Microsoft • В Office 2007 csv формат разделяется запятой • В Office 2010 csv формат разделяется точкой с запятой
Задача: добавить файл в csproj ручками • Суть csproj на самом деле простая – это XML, только с пространством имен
Тесты
Аксессоры доступа • Суть проблемы – есть инкапсуляция. Следовательно, надо все «внутренности» объявлять с аксессором private. Но если public функция состоит из вызовов простых функций, то эти простые функции желательно тоже протестировать. • Но у внутренних функций аксессор доступа – private. Программист сам пишет тесты, поэтому знает название и аргументы. • Решение «в лоб» - вызвать её через рефлексию.
Минусы такого подхода • Необходимо помнить о кучке флагов Binding. Flags • Название метода – строка, поэтому изменение названия метода представляет из себя мелкую проблему • Параметры метода – массив объектов, поэтому изменение параметров метода так же представляет из себя мелкую проблему • Изменение аксессора доступа – мелкая проблема, надо перечислять флаги var flags = Binding. Flags. Non. Public | Binding. Flags. Instance | Binding. Flags. Public; • Результат – кучка мелких проблем • Хочется счастья, при этом не хочется делать много лишних действий
Счастье • Использование условной компиляции + создание новой конфигурации – Переходим в Configuration. Manager – Выбираем новую конфигурацию
Счастье (продолжение) • Создаем новую конфигурацию на основании Debug
И еще немного счастья • В свойствах проекта в Test конфигурации, на закладке Build, надо добавить символьную константу TEST
Функция приобретает следующий вид: #if (TEST) public #else private #endif int get. Max(int a, int b) { return Math. Max(a, b); }
Все тесты обрамляем в условную компиляцию • В прилагаемой директории - Пример суммирование целых чисел, условная компиляция
Рефлексия • Рефлексия позволяет сделать то, что нельзя иногда сделать другими средствами. – Зам. В последних версиях появилось что-то близкое к рефлексии – деревья выражений, но это не для слабонервных • Рефлексия основана на метаинформации, которую можно получить на основании информации о типе.
Задача: сделать то, что невозможно без рефлексии • Задача: необходимо изменить readonly поле не в конструкторе и не при объвялении. • Следствие: readonly с точки зрения выполняемого кода ничем не отличается от обычного
Задача: сделать логирование необходимых полей • Задача: у нас приходит объект. Надо записать в лог все его свойства за исключением некоторых. Эти некоторые свойства помечены специальным атрибутом. У некоторых свойств будет специальный атрибут, который будет указывать имя, которое должно быть записано в лог.