TOC

This article has been localized into Russian by the community.

Введение:

Анонимные типы

Пока мы узнали, что объекты поступают из класса. Класс объявляется с несколькими полями, свойствами и / или методами, после чего можно создать экземпляр этого класса в качестве объекта. Однако с появлением анонимных типов больше не требуется объявлять класс перед созданием объекта. Не волнуйтесь, классы вовсе не мертвы, потому что анонимные типы (или объекты) поставляется с несколькими ограничениями, но для некоторых ситуаций они действительно хороши!

Анонимный тип инициализируется с помощью оператора new в сочетании с инициализатором объекта - в этом отношении это очень похоже на создание экземпляра класса, только вы оставляете имя класса. Кроме того, поскольку за объектом нет класса, при получении ссылки на объект необходимо использовать ключевое слово var. Это может показаться сложным, но следующий пример должен показать вам, что это совсем не сложно:

var user = new    
{    
Name = "John Doe",    
Age = 42  
};
Console.WriteLine(user.Name + " - " + user.Age + " years old");

Вот и все - теперь у нас есть объект с информацией (имя и возраст) о пользователе. Анонимные типы отлично подходят для многих ситуаций, особенно когда вам просто нужно быстро вернуть что-то, с большей сложностью, чем просто строка или число. Анонимные типы позволяют создавать свойства на лету, не беспокоясь об объявлении класса, а затем изменять этот класс при необходимости. Но, как уже упоминалось, существует несколько ограничений, которые необходимо учитывать при использовании анонимного типа определения класса:

  • В отличие от реального класса, анонимный тип не может иметь поля или методы - только свойства
  • После инициализации объекта в него нельзя добавить новые свойства
  • Свойства только для чтения - как только объект был инициализирован, вы не можете изменить их значения

Но с учетом сказанного, анонимные типы по-прежнему чрезвычайно практичны для многих задач. Распространенным сценарием использования является ситуация, когда у вас есть сложный объект (из определенного класса), и вам нужно упростить его, например, потому, что вы должны держать объект как можно меньше, чтобы отправить его в браузер или, возможно, потому, что полный объект имеет конфиденциальную информацию, которую вы не хотите предоставлять потребителю. Анонимные типы отлично подходят для этого, как показано в следующем примере:

using System;
using System.IO;

namespace AnonymousTypes
{
    class Program
    {
static void Main(string[] args)
{
    string pathOfExe = System.Reflection.Assembly.GetEntryAssembly().Location;
    FileInfo fileInfo = new FileInfo(pathOfExe);
    var simpleFileInfo = new
    {
Filename = fileInfo.Name,
FileSize = fileInfo.Length
    };
    Console.WriteLine("File name: " + simpleFileInfo.Filename + ". Size: " + simpleFileInfo.FileSize + " bytes");
}
    }
}

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

Вы, вероятно, заметили, что мы даем имя каждому из свойств, определенных в нашем анонимном типе (Filename и FileSize) - это имеет довольно хороший смысл, так как мы хотим получить к ним доступ позже. Однако, когда мы основываем наш объект на информации из существующего объекта, мы можем фактически оставить наше собственное имя и позволить компилятору просто использовать имя свойства, которое мы ему назначаем, как это:

var simpleFileInfo = new
{
    fileInfo.Name,
    fileInfo.Length
};

Итак, мы имеем два свойства называются Name и Length, вместо Filename и FileSize. Довольно приятное удобство, если Вы не заботитесь о именах или, возможно, более вероятно: если вы на самом деле предпочитаете те же имена, что и исходный объект.

Резюме

Анонимные типы позволяют быстро создавать экземпляры объектов с одним или несколькими свойствами. Эти свойства доступны только для чтения, и вы не сможете добавить дополнительные свойства позднее.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!