Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 217 218 219 220 221 222 223 224 225 ... 407
(ci is CompanyInfoAttribute));

  // Отобразить данные.

  foreach (CompanyInfoAttribute c in compInfo)

    {

    Console.WriteLine($"More info about {c.CompanyName}

                        can be found at {c.CompanyUrl}");

  }

}

Наконец, модифицируйте операторы верхнего уровня следующим образом:

Console.WriteLine("***** Welcome to MyTypeViewer *****");

string typeName = "";

do

{

  Console.WriteLine("nEnter a snapin to load");

                    // Введите оснастку для загрузки

  Console.Write("or enter Q to quit: ");

              // или Q для завершения

  // Получить имя типа.

  typeName = Console.ReadLine();

  // Желает ли пользователь завершить работу?

  if (typeName.Equals("Q", StringComparison.OrdinalIgnoreCase))

  {

    break;

  }

  // Попытаться отобразить тип.

  try

  {

    LoadExternalModule(typeName);

  }

  catch (Exception ex)

  {

    // Найти оснастку не удалось.

    Console.WriteLine("Sorry, can't find snapin");

  }

}

while (true);

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

Резюме

Рефлексия является интересным аспектом надежной объектно - ориентированной среды. В мире .NET Core службы рефлексии вращаются вокруг класса System.Туре и пространства имен System.Reflection. Вы видели, что рефлексия — это процесс помещения типа под "увеличительное стекло" во время выполнения с целью выяснения его характеристик и возможностей.

Позднее связывание представляет собой процесс создания экземпляра типа и обращения к его членам без предварительного знания имен членов типа. Позднее связывание часто является прямым результатом динамической загрузки, которая позволяет программным образом загружать сборку .NET Core в память. На примере построения расширяемого приложения было продемонстрировано, что это мощный прием, используемый разработчиками инструментов, а также их потребителями.

Кроме того, в главе была исследована роль программирования на основе атрибутов. Снабжение типов атрибутами приводит к дополнению метаданных лежащей в основе сборки.

Глава 18

Динамические типы и среда DLR

В версии .NET 4.0 язык C# получил новое ключевое слово dynamic, которое позволяет внедрять в строго типизированный мир безопасности к типам, точек с запятой и фигурных скобок поведение, характерное для сценариев. Используя такую слабую типизацию, можно значительно упростить решение ряда сложных задач написания кода и получить возможность взаимодействия с несколькими динамическими языками (вроде IronRuby и IronPython), которые поддерживают .NET Core.

В настоящей главе вы узнаете о ключевом слове dynamic и о том, как слабо типизированные вызовы отображаются на корректные объекты в памяти с применением исполняющей среды динамического языка (Dynamic Language Runtime — DLR). После освоения служб, предлагаемых средой DLR, вы увидите примеры использования динамических типов для облегчения вызова методов с поздним связыванием (через службы рефлексии) и простого взаимодействия с унаследованными библиотеками СОМ.

На заметку! Не путайте ключевое слово dynamic языка C# с концепцией динамической сборки (объясняемой в главе 19). Хотя ключевое слово dynamic может применяться при построении динамической сборки, все же это две совершенно независимые концепции.

Роль ключевого слова dynamic языка C#

В главе 3 вы ознакомились с ключевым словом var, которое позволяет объявлять локальные переменные таким способом, что их действительные типы данных определяются на основе начального присваивания во время компиляции (вспомните, что результат называется неявной типизацией). После того как начальное присваивание выполнено, вы имеете строго типизированную переменную, и любая попытка присвоить ей несовместимое значение приведет к ошибке на этапе компиляции.

Чтобы приступить к исследованию ключевого слова dynamic языка С#, создайте новый проект консольного приложения по имени DynamicKeyword. Добавьте в класс Program следующий метод и удостоверьтесь, что финальный оператор кода на самом деле генерирует ошибку на этапе компиляции, если убрать символы комментария:

static void ImplicitlyTypedVariable()

{

  // Переменная а имеет тип List<int>.

  var a = new List<int> {90};

  // Этот оператор приведет к ошибке на этапе компиляции!

  // a = "Hello";

}

Использование неявной типизации лишь потому, что она возможна, некоторые считают плохим стилем (если известно, что необходима переменная типа List<int>, то так и следует ее объявлять). Однако, как было показано в главе 13, неявная типизация удобна в сочетании с LINQ, поскольку многие запросы LINQ возвращают перечисления анонимных классов (через проецирование), которые напрямую объявлять в коде C# невозможно. Тем не менее, даже в таких случаях неявно типизированная переменная фактически будет строго типизированной.

В качестве связанного замечания: в главе 6 упоминалось, что System.Object является изначальным родительским классом внутри инфраструктуры .NET Core и может представлять все, что угодно. Опять-таки, объявление переменной типа object в результате дает строго типизированный фрагмент данных, но то, на что указывает эта переменная в памяти, может отличаться в зависимости от присваиваемой ссылки. Чтобы получить доступ к членам объекта, на который указывает ссылка в памяти, понадобится выполнить явное приведение.

Предположим, что есть простой класс по имени Person, в котором определены два автоматических свойства (FirstName и LastName), инкапсулирующие данные string. Взгляните на следующий код:

static void UseObjectVariable()

{

  // Пусть имеется класс по имени Person.

  object o = new Person() { FirstName = "Mike", LastName = "Larson" };

  // Для получения доступа к свойствам Person.

  // переменную о потребуется привести к Person

  Console.WriteLine("Person's first name is {0}", ((Person)o).FirstName);

}

А теперь возвратимся к ключевому слову dynamic. С высокоуровневой точки значения ключевое слово dynamic можно трактовать как специализированную форму типа System.Object — в том смысле, что переменной динамического типа данных может быть присвоено любое значение. На первый взгляд это может привести к серьезной путанице, поскольку теперь получается, что доступны три способа определения данных, внутренний тип которых явно не указан в кодовой базе. Например, следующий метод:

static void PrintThreeStrings()

{

  var s1 = "Greetings";

  object s2 = "From";

  dynamic s3 = "Minneapolis";

  Console.WriteLine("s1 is of type: {0}", s1.GetType());

 

1 ... 217 218 219 220 221 222 223 224 225 ... 407
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен бесплатно.

Оставить комментарий