Статья - Резиновые объекты - C#
Формулировка задачи:
Очень часто программисту необходимо создавать объекты, которые представляют собой чистые хранилища для данных. У таких объектов нет никакого поведения. Они содержат только свойства, которые можно читать и записывать.
Например, вы пишете программу-каталог для книг. Соответственно, у вас есть класс Создавать подобные классы занятие довольно муторное. Приходится монотонно перебирать все свойства объекта. А количество таких свойств может исчисляться десятками, а то и сотнями.
Хуже того, когда вам понадобится включить в класс новое свойство, допустим «Формат», вам придется модифицировать описание вашего класса.
Начиная с четвертой версии в .Net Framework появилась поддержка для динамических языков, что дает нам возможность существенно упростить работу с подобными классами.
В данном случае нам поможет класс, который называется Обратите внимание, что переменная И как только программа во время выполнения дойдет до этой строчки, так сразу же у нашего объекта появится соответствующее свойство. Причем эту запись можно вставить в любое место нашей программы.
Просто и удобно. Но, конечно, за такую простоту приходится платить.
Чем принципиально динамические объекты отличаются от обычных объектов? Дело в том, что когда вы вызываете какие-либо свойства или методы динамического объекта, то все проверки корректности такого вызова происходят только в момент выполнения программы. Компилятор никак не может проверить, что вы делаете правильный вызов.
Например, если вы в нашей программе напишете
То компилятор, не сможет сообщить вам об ошибке. То, что в свойстве Name хранится текстовая строка, компилятору не известно. Поэтому ошибка проявится только на стадии выполнения программы.
Отсюда следует очевидный вывод. Программы, которые используют динамические возможности
Book
, который описывает конкретную книгу. Этот класс может выглядеть следующим образом:public class Book { public string Name { get; set; } // Название public string Author { get; set; } // Автор public string Publisher { get; set; } // Издательство public int Year { get; set; } // Год выпуска }
ExpandoObject
и располагается в пространстве именSystem.Dynamic
. Объекты этого класса могут динамически, во время исполнения программы приобретать новые свойства. Поэтому, нет необходимости описывать в декларации, какие именно свойства имеются у данного объекта. Делается это следующим образом:static void Main(string[] args) { dynamic book = new ExpandoObject(); book.Name = "Рефакторинг с использованием шаблонов"; book.Author = "Дж. Кериевски"; Console.WriteLine(book.Name); Console.WriteLine(book.Author); Console.ReadKey(); }
book
объявляется с помощью ключевого словаdynamic
. Никаких свойств мы нигде не декларируем. СвойствоName
у объектаbook
появляется в тот момент, когда мы пытаемся записать значение в это свойство. Если нам в будущем понадобится добавить в описание книги свойство«Формат»
, то мы просто напишем:book.Format = "A5";
int i = book.Name;
.Net Framework
нужно очень тщательно тестировать. Еще один недостаток динамических типов заключается в том, что они требуют гораздо больше ресурсов. Программы, которые активно используют эти возможности, исполняются существенно медленнее. Тем не менее, иногда воспользоваться возможностями, которые предоставляют динамические типы бывает очень полезно.Решение задачи: «Статья - Резиновые объекты»
textual
Листинг программы
Console.WriteLine(book["Format"]); // A5
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д