Como trabalhar com Records, Tipos Anônimos e Mutação não destrutiva
Tags: programming, csharp
Published: 2022-09-23 12:00:07


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m56eeh731mc31ak2buxd.png)

Fala Dev!!, hoje vou compartilhar alguns pontos relevantes que você pode fazer com os registros (**Record**) e tipos anônimos. Vou mostrar também conceitos de mutação não destrutiva (**non-destructive** ). E falar quando utilizar e por que usar esses recursos do C#.

## <u>Qual é desse Record?</u>
Com o C# 9 podemos usar [record](https://learn.microsoft.com/pt-br/dotnet/csharp/whats-new/tutorials/records) que são um novo tipo de referência. Que você pode criar em vez de classes ou structs.

O C# 10 introduziu a estrutura Record, para que você possa definir como tipos de valor. Os registros são distintos das classes em que os tipos usam igualdade baseada em valor.

> 💡 _[Tipos de valor](https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/builtin-types/value-types)? vamos revisar._

Veja no exemplo:
```csharp
public record Customer(string Name, double Height);
```
Está é a forma de declarar um record, chamado de registro posicional. Definido como construtor primário.

As propriedades Name e Address são propriedades apenas de inicialização, o que significa que elas só podem ser definidas no construtor ou usando um inicializador de propriedade.

## <u>Sobre Non-Destructive mutação usando a expressão With</u>

Não podemos modificar as propriedades do nosso record, porque as propriedades são apenas **init**. No entanto, podemos usar a expressão **[with (introduzida no C# 9)](https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/operators/with-expression)** para criar uma nova instância do nosso registro com valores modificados. 

Uma expressão with produz uma cópia de seu operando com as propriedades e campos especificados modificados

Vejamos no exemplo:

```csharp
var firstRegistration = new Customer("William", 1.70);

var changeSize = firstRegistration with
{
   Height = 1.75
};
```
Fica ligado! ⚠️

1. A instância **firstRegistration** permanece inalterada.

2. Expressão with cria uma nova instância do record apenas com a propriedade Height modificada.

Como prometido que iria falar sobre Tipos Anônimos, então deixe-me mostrar algo surpreendente.

## <u>Anonymous Types e Non-Destructive mutação:</u>

Você sabe como utilizar o **expressão with** com tipos anônimos?

Criando um tipo anonymous: 

```csharp
var secondRegistration = new 
{
   Name = "Maria",
   Height = 1.90
};
```
É assim que modificamos usando a expressão **with**:

```csharp
var thirdRegistration = secondRegistration with  
{
   Name = "João"
};
```
E novamente as mesmas regras se aplicam:

1. A instância original **secondRegistration** permanece inalterada.

2. A expressão with acaba criando uma nova instância de tipo anônimo onde temos apenas a propriedade **Name** modificada.

Onde esté recurso pode ser útil? Utilizando métodos LINQ, Carregar um tipo anônimo do banco de dados em que alguma propriedade esteja em valor default. Você também pode está utilizando para calcular  valores dessas propriedades em memoria. Mais sobre [non-destructive](https://www.stevefenton.co.uk/2020/05/csharp-9-non-destructive-mutation/)
<br>
Gostou da dica? Deixe seu like!!

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u6v8rives2vb38t33sd0.png)
Participe do nosso grupo: https://discord.gg/pzU5sDBS6B

>  _**Vai pra cima DEV!!**_