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 new
operador com um inicializador de objeto . Por exemplo, o seguinte demonstra como criar um tipo anônimo com duas propriedades denominadas Name
and 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.99
Linguagem de código: C# ( cs )
Se você passar o mouse sobre as propriedades Name
ou Price
, verá que o compilador infere o tipo da Name
propriedade para string e o tipo da Price
propriedade para double
:
Como as propriedades Name
and Price
são somente leitura, se você tentar atribuir um novo valor a ela, receberá um erro de compilação. Por exemplo:
product.Price = 2000; // error
Linguagem de código: C# ( cs )
Para formar um novo objeto anônimo com mesmo nome e preço diferente, você pode usar a with
expressão.
A with
expressã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.99
Linguagem de código: C# ( cs )
Neste exemplo, usamos a with
expressão para criar uma nova instância do mesmo tipo anônimo com o product
objeto, mas com o novo Price
valor.
É 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 ProductAttribute
classe.
O supertipo de tipos anônimos
Tipos anônimos herdam diretamente do object
tipo. 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()); // true
Linguagem de código: C# ( cs )
Saída:
<>f__AnonymousType0`2[System.String,System.Double]
True
Linguagem de código: C# ( cs )
Neste exemplo, productX
e productY
compartilhará 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:
True
Linguagem de código: C# ( cs )
A razão é que os tipos anônimos substituem os métodos Equals
e GetHashCode
em termos Equals
e GetHashCode
métodos de suas propriedades.
Tipos anônimos substituem o ToString
método concatenando os resultados do ToString
mé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
new
palavra-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.