Статья - Резиновые объекты - C#

Узнай цену своей работы

Формулировка задачи:

Очень часто программисту необходимо создавать объекты, которые представляют собой чистые хранилища для данных. У таких объектов нет никакого поведения. Они содержат только свойства, которые можно читать и записывать. Например, вы пишете программу-каталог для книг. Соответственно, у вас есть класс

Book

, который описывает конкретную книгу. Этот класс может выглядеть следующим образом:
public class Book
{
    public string Name { get; set; }        // Название 
    public string Author { get; set; }      // Автор
    public string Publisher { get; set; }   // Издательство
    public int Year { get; set; }           // Год выпуска
}
Создавать подобные классы занятие довольно муторное. Приходится монотонно перебирать все свойства объекта. А количество таких свойств может исчисляться десятками, а то и сотнями. Хуже того, когда вам понадобится включить в класс новое свойство, допустим «Формат», вам придется модифицировать описание вашего класса. Начиная с четвертой версии в .Net Framework появилась поддержка для динамических языков, что дает нам возможность существенно упростить работу с подобными классами. В данном случае нам поможет класс, который называется

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;
То компилятор, не сможет сообщить вам об ошибке. То, что в свойстве Name хранится текстовая строка, компилятору не известно. Поэтому ошибка проявится только на стадии выполнения программы. Отсюда следует очевидный вывод. Программы, которые используют динамические возможности

.Net Framework

нужно очень тщательно тестировать. Еще один недостаток динамических типов заключается в том, что они требуют гораздо больше ресурсов. Программы, которые активно используют эти возможности, исполняются существенно медленнее. Тем не менее, иногда воспользоваться возможностями, которые предоставляют динамические типы бывает очень полезно.

Решение задачи: «Статья - Резиновые объекты»

textual
Листинг программы
Console.WriteLine(book["Format"]); // A5

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.5 из 5
Похожие ответы