Tipos anônimos C#

Resumo : neste tutorial, você aprenderá sobre tipos anônimos C# para criar um único objeto que consiste em propriedades somente leitura sem precisar definir uma classe primeiro.

Introdução aos tipos anônimos C#

Normalmente, você define uma classe que possui um conjunto de propriedades e usa a classe para criar objetos.

Mas às vezes você precisa criar um objeto que possua um conjunto de propriedades somente leitura sem precisar definir uma classe. Para fazer isso, você usa tipos anônimos.

Por definição, os tipos anônimos permitem encapsular um conjunto de propriedades somente leitura em um único objeto sem precisar definir uma classe primeiro.

Nos bastidores, o compilador gerará o nome do tipo anônimo. Portanto, o nome do tipo não está acessível no nível do código-fonte. O compilador também infere o tipo de cada propriedade do tipo anônimo.

Para criar tipos anônimos, você usa o newoperador com um inicializador de objeto . Por exemplo, o seguinte demonstra como criar um tipo anônimo com duas propriedades denominadas Nameand Price:

using static System.Console;

var product = new
{
    Name = "Phone X",
    Price = 999.99
};

WriteLine($"{product.Name} : {product.Price:C}");Linguagem de código:  C#  ( cs )

Saída:

Phone X : $999.99Linguagem de código:  C#  ( cs )

Se você passar o mouse sobre as propriedades Nameou Price, verá que o compilador infere o tipo da Namepropriedade para string e o tipo da Pricepropriedade para double:

c# tipos anônimos

Como as propriedades Nameand Pricesão somente leitura, se você tentar atribuir um novo valor a ela, receberá um erro de compilação. Por exemplo:

product.Price = 2000; // errorLinguagem de código:  C#  ( cs )

Para formar um novo objeto anônimo com mesmo nome e preço diferente, você pode usar a withexpressão.

A withexpressão cria um objeto de tipo anônimo onde uma ou mais propriedades possuem novos valores. Por exemplo:

using static System.Console;

var product = new
{
    Name = "Phone X",
    Price = 999.99
};
WriteLine($"{product.Name} : {product.Price:C}");


var productX = product with
{
    Price = 1099.99
};
WriteLine($"{productX.Name} : {productX.Price:C}");
Linguagem de código:  C#  ( cs )

Saída:

Phone X : $999.99
Phone X : $1,099.99Linguagem de código:  C#  ( cs )

Neste exemplo, usamos a withexpressão para criar uma nova instância do mesmo tipo anônimo com o productobjeto, mas com o novo Pricevalor.

É possível definir uma matriz de tipos anônimos como este:

var products = new[]
{
    new { Name = "Phone X", Price = 999.99 },
    new { Name = "Computer Y", Price = 1999.99 },
    new { Name = "Tablet Z", Price = 2999.99 }
};Linguagem de código:  C#  ( cs )

E um tipo anônimo pode ter propriedades que são instâncias de tipos explícitos. Por exemplo:

using static System.Console;


var product = new
{
    Name = "Phone X",
    Price = 999.99,
    attribute = new ProductAttribute() { Color = "Black", Weight = 100 }
};

WriteLine($"{product.Name}: {product.attribute.Color}");



class ProductAttribute
{
    public string? Color
    {
        get; init;
    }
    public decimal? Weight
    {
        get; init;
    }
}Linguagem de código:  C#  ( cs )

Neste exemplo, definimos um objeto anônimo com uma propriedade que é uma instância da ProductAttributeclasse.

O supertipo de tipos anônimos

Tipos anônimos herdam diretamente do objecttipo. E você não pode converter tipos anônimos para qualquer tipo, exceto object.

Se você tiver dois ou mais objetos anônimos que possuem o mesmo conjunto de propriedades na mesma ordem e tipos, o compilador tratará esses objetos com o mesmo tipo. Em outras palavras, eles compartilham o mesmo tipo gerado. Por exemplo:

using static System.Console;

var productX = new { Name = "Phone X", Price = 999.99 };
var productY = new { Name = "Phone Y", Price = 555.99 };

WriteLine(productX.GetType() == productY.GetType()); // trueLinguagem de código:  C#  ( cs )

Saída:

<>f__AnonymousType0`2[System.String,System.Double]
TrueLinguagem de código:  C#  ( cs )

Neste exemplo, productXe productYcompartilhará o mesmo nome do tipo anônimo. Observe que você pode obter um nome de tipo gerado diferente.

Dois objetos anônimos do mesmo tipo são iguais se todas as suas propriedades forem iguais. Por exemplo:

using static System.Console;

var productX = new { Name = "Phone X", Price = 99 };
var productY = new { Name = "Phone X", Price = 99 };

WriteLine(productX.Equals(productY));Linguagem de código:  C#  ( cs )

Saída:

TrueLinguagem de código:  C#  ( cs )

A razão é que os tipos anônimos substituem os métodos Equalse GetHashCodeem termos Equalse GetHashCodemétodos de suas propriedades.

Tipos anônimos substituem o ToStringmétodo concatenando os resultados do ToStringmétodo de todas as propriedades e colocando-o entre chaves:

using static System.Console;

var productX = new { Name = "Phone X", Price = 99 };

WriteLine(productX.ToString());Linguagem de código:  C#  ( cs )

Saída:

using static System.Console;

var productX = new { Name = "Phone X", Price = 99 };

WriteLine(productX.ToString());Linguagem de código:  C#  ( cs )

Saída:

{ Name = Phone X, Price = 99 }Linguagem de código:  C#  ( cs )

Resumo

  • Use tipos anônimos para criar um objeto com propriedades somente leitura.
  • Use a newpalavra-chave e um inicializador de objeto para declarar um tipo anônimo.
  • Use tipos anônimos quando quiser criar um objeto que armazene dados temporariamente sem definir um tipo separado.
  • Tipos anônimos são imutáveis, digitados implicitamente e criados em tempo de execução.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *