Категории
Войти
Поиск
Реклама
Задайте вопрос про отучить ребенка от грудного вскармливания специалисту.|фильтры очистки воды знаем гдевытягивание вмятин без покраскиПолезное:
Новые статьи
Опечатка?
Выделите текст и нажмите Shift+Enter.
И мы в ближайшее время ее исправим!
Счетчики
| Код, генерируемый для типизированного набора данных |
|
Как только вы сохраняете определение вашего набора данных, запускается инструмент генерации кода, который неявно создаст сильно типизированные классы для этого набора. Эти классы соответствуют элементам схемы данных, которые вы определили в конструкторе наборов. Как и в случае конструктора Windows Forms, этот код помещается в файлы с расширением .Designer.cs (или .Designer.vb для проектов VB), которые затем отображаются в окне Solution Explorer в качестве потомков файла XSD. Одновременно с этим генерируются и два других вспомогательных файла конструктора (файлы с расширениями XSC и XSS). Когда вы взглянете на определение вашего типизированного набора данных в окне Solution Explorer, то увидите что-то похожее на 2.9. Если вы откроете файл CustomersDataSet.Designer.cs, то увидите огромную массу генерированного за вас кода (более тысячи строк на каждую таблицу в наборе данных). Просмотреть этот код и попытаться уловить его смысл - поначалу это покажется довольно трудной задачей, но на листинге 2.3 приведены наиболее важные его части, а с остальными вы еще будете встречаться на протяжении этой статьи. Листинг 2.3 представляет собой весьма сокращенную версию этого файла с добавлением поясняющих комментариев. Относительно кода в листинге 2.3 необходимо сделать несколько замечаний. Во-первых, как уже отмечалось ранее, класс типизированного набора данных сам по себе является просто производным классом от DataSet. В определении этого класса используется новая форма неполных классов, появившаяся в .NET 2.0, что позволяет определению класса простираться за пределы единственного файла. С неполными классами вы можете расположить код типизированного набора данных, отвечающий, например, за подтверждения или рабочую логику, в отдельном файле вашего проекта, причем этот файл не будет затронут при повторной генерации определения типизированного набора данных. Для многих разработчиков в .NET 1.x это было серьезной проблемой; когда они хотели изменить определение набора данных, то теряли при повторной генерации кода все внесенные изменения, а это происходило при каждом сохранении XSD-файла, из которого генерировался код. Далее, вы можете заметить, что для каждой таблицы из набора данных имеются открытые свойства на уровне набора данных, объявляемые сильно типизированным классом, специфическим для этой таблицы. Если между таблицами определены отношения, они представляются как элементы класса набора; к ним можно обращаться по имени через свойство Relations набора данных. Как можно видеть, скелет определения CustomersDataTable точно так же использует наследование, являясь производным от DataTable. В пределах класса таблицы (наряду со многими не показанными элементами класса) определен сильно типизированный индексатор для семейства строк таблицы. При помощи этого индексатора вы при любом обращении к строке по некоторому номеру получаете ссылку типа CustomersRow. Класс CustomersRow сам является производным от DataRow, который также определен, как вложенный класс внутри класса набора данных. Посредством ссылки на CustomersRow вы можете получить сильно типизированный доступ к любому из столбцов строки по свойству Name, которое вы установили для столбца в определении набора данных (как было описано при обсуждении 2.7). Оба эти определения ТИПОВ, CustomersDataTable и CustomersRow, являются вложенными классами внутри класса CustomersDataSet. Это означает, что для создания в своем коде переменной такого типа вы должны указывать и внешний класс в форме CustomersDataSet. CustomersRow, как это сделано в листинге 2.2. Кроме того, что здесь показано, генерируется большой объем кода для поддержки открытых вовне элементов этих классов. В каждом классе имеется масса инициализирующего кода, исполняемого во время конструирования; этот код подготавливает схему, лежащую в основе набора данных, так что тот будет содержать надлежащие таблицы, столбцы, отношения, ограничения целостности и т.д. Инициализирующий код также подготавливает некоторый код для оптимизации скорости доступа к каждому отдельному столбцу в наборе данных при доступе через сильно типизированные свойства. Настоятельно рекомендую потратить некоторое время и просмотреть код типизированного набора данных, чтобы составить себе представление о его содержании. Обычный способ работы с типизированным набором подразумевает, что для вас это просто «черный ящик», однако очень полезно бывает знать, как работают черные ящики, если вы действительно хотите понять, что происходит в вашей программе, и разобраться, почему она ведет себя не так, как вы думали. Такое знание может оказаться полезным и в том случае, когда вы используете этот «черный ящик» неправильно, и отладчик останавливается на какой-то строке кода внутри определения набора данных, где это привело к катастрофе.
Newer news items:
Older news items:
|
