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

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

Читать бесплатно Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Определение анонимного типа

Анонимный тип определяется с использованием ключевого слова var (см. главу 3) в сочетании с синтаксисом инициализации объектов (см. главу 5). Ключевое слово var должно применяться из-за того, что компилятор будет автоматически генерировать новое определение класса на этапе компиляции (причем имя этого класса никогда не встретится в коде С#). Синтаксис инициализации применяется для сообщения компилятору о необходимости создания в новом типе закрытых поддерживающих полей и (допускающих только чтение) свойств.

В целях иллюстрации создайте новый проект консольного приложения по имени AnonymousTypes. Затем добавьте в класс Program показанный ниже метод, который формирует новый тип на лету, используя данные входных параметров:

static void BuildAnonymousType( string make, string color, int currSp )

{

  // Построить анонимный тип с применением входных аргументов.

  var car = new { Make = make, Color = color, Speed = currSp };

  // Обратите внимание, что теперь этот тип можно

  // использовать для получения данных свойств!

  Console.WriteLine("You have a {0} {1} going {2} MPH",

                     car.Color, car.Make, car.Speed);

  // Анонимные типы имеют специальные реализации каждого

  // виртуального метода System.Object. Например:

  Console.WriteLine("ToString() == {0}", car.ToString());

}

Обратите внимание, что помимо помещения кода внутрь функции анонимный тип можно также создавать непосредственно в строке:

Console.WriteLine("***** Fun with Anonymous Types *****n");

// Создать анонимный тип, представляющий автомобиль.

var myCar = new { Color = "Bright Pink", Make = "Saab",

                  CurrentSpeed = 55 };

// Вывести на консоль цвет и производителя.

Console.WriteLine("My car is a {0} {1}.", myCar.Color, myCar.Make);

// Вызвать вспомогательный метод для построения

// анонимного типа с указанием аргументов.

BuildAnonymousType("BMW", "Black", 90);

Console.ReadLine();

В настоящий момент достаточно понимать, что анонимные типы позволяют быстро моделировать "форму" данных с небольшими накладными расходами. Они являются лишь способом построения на лету нового типа данных, который поддерживает базовую инкапсуляцию через свойства и действует в соответствии с семантикой на основе значений. Чтобы уловить суть последнего утверждения, давайте посмотрим, каким образом компилятор C# строит анонимные типы на этапе компиляции, и в особенности — как он переопределяет члены System.Object. 

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

Внутреннее представление анонимных типов

 Все анонимные типы автоматически наследуются от System.Object и потому поддерживают все члены, предоставленные этим базовым классом. В результате можно вызывать метод ToString(), GetHashCode(), Equals() или GetType() на неявно типизированном объекте myCar. Предположим, что в классе Program определен следующий статический вспомогательный метод:

static void ReflectOverAnonymousType(object obj)

{

  Console.WriteLine("obj is an instance of: {0}",

    obj.GetType().Name);

  Console.WriteLine("Base class of {0} is {1}",

    obj.GetType().Name, obj.GetType().BaseType);

  Console.WriteLine("obj.ToString() == {0}", obj.ToString());

  Console.WriteLine("obj.GetHashCode() == {0}",

    obj.GetHashCode());

  Console.WriteLine();

}

Пусть вы вызвали метод ReflectOverAnonymousType(), передав ему объект myCar в качестве параметра:

Console.WriteLine("***** Fun with Anonymous Types *****n");

// Создать анонимный тип, представляющий автомобиль.

var myCar = new {Color = "Bright Pink", Make = "Saab",

  CurrentSpeed = 55};

// Выполнить рефлексию того, что сгенерировал компилятор.

ReflectOverAnonymousType(myCar);

...

Console.ReadLine();

Вывод будет выглядеть примерно так:

***** Fun with Anonymous Types *****

obj is an instance of: <>f__AnonymousType0`3

Base class of <>f__AnonymousType0`3 is System.Object

obj.ToString() = { Color = Bright Pink, Make = Saab, CurrentSpeed = 55 }

obj.GetHashCode() = -564053045

Первым делом обратите внимание в примере на то, что объект myCar имеет тип <>f__AnonymousType0`3 (в вашем выводе имя типа может быть другим). Помните, что имя, назначаемое типу, полностью определяется компилятором и не доступно в коде C# напрямую.

Пожалуй, наиболее важно здесь то, что каждая пара "имя-значение", определенная с использованием синтаксиса инициализации объектов, отображается на идентично именованное свойство, доступное только для чтения, и соответствующее закрытое поддерживающее поле, которое допускает только инициализацию. Приведенный ниже код C# приблизительно отражает сгенерированный компилятором класс, применяемый для представления объекта myCar (его можно просмотреть посредством утилиты ildasm.exe):

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Язык программирования C#9 и платформа .NET5 отзывы

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


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*