C#  10 - Os novos recursos do tipo Struct


 Hoje veremos as novidades relacionadas ao tipo Struct na linguagem C#.

O tipo Struct passou por algumas mudanças interessantes no C# 10. Vejamos alguns destes novos recursos.

Construtor sem parâmetros

Uma das principais mudanças no que diz respeito à estrutura foi a introdução ao suporte para construtores sem parâmetros explícitos.

Por exemplo a seguir temos um código feito no C# 10 que em versões anteriores não compilava:

A restrição que existiam para o uso de construtor sem parâmetro foi removida e agora podemos usar construtores explícitos para nos tipos Struct.

No entanto, devemos ter cuidado para garantir que todos os campos sejam inicializados no construtor. Por exemplo, o código a seguir é inválido :

public struct Teste
{
    public Teste() => Nome = "José";
    public string Nome { get; set; }
    public string Sobrenome { get; set; }
}

Abaixo vemos o erro que o compilador emite:

Temos uma exceção reclamando que a propriedade Sobrenome deve ser não nula ou totalmente atribuída antes que o controle retorne o chamador.

Isso nos traz uma diferença importante que os desenvolvedores precisam estar cientes ao migrar do C# 9 para o C# 10.

Considere o código a seguir.

Teste teste1 = new();
Teste teste2 = default;
Console.WriteLine($"teste1 Equals teste2 : {Equals(teste1, teste2)}");

O código acima fornecia uma verificação true para Equals para qualquer struct no C# 9.0.

No entanto, quando se trata de C# 10, não se pode ter certeza, a menos que se verifique a fonte para garantir que o construtor padrão não esteja definido explicitamente. Se o construtor padrão explícito for definido, os campos serão inicializados e poderão ter um valor diferente.

Inicializadores de campos

Antes do C# 10 um tipo Struct não permitiria a utilização de inicializadores de campos, e assim o código a seguir seria inválido inválido no C# 10:

public struct Teste
{
    public Teste(string nome, string sobrenome)
    {
        Nome = nome;
        Sobrenome = sobrenome;
    }
    public string Nome { get; set;} = "José";
    public string Sobrenome {get;set;} = "Macoratti";
}

Suporte a expressão With

Outra melhoria importante para o tipo struct no C# 10 é o suporte para a expressão with.

No C# 9, o tipo record foi introduzido no C# como uma forma de criar estruturas de dados imutáveis com propriedades imutáveis. As expressões with permitiram que os desenvolvedores criassem clones de registros existentes com mudanças sutis. Por exemplo

var joseMacoratti = new
{
    Nome = "Jose",
    Sobrenome = "Macoratti"
};
var maria = joseMacoratti with
{
    Nome = "Maria"
};
public record Pessoa(string Nome, string Sobrenome);

 

Aqui a instância maria é um novo objeto criado com suas propriedades tendo o mesmo valor que joseMacoratti, exceto pelo Nome que recebeu um novo valor.

Agora temos o suporte para o uso da expressão With com o o tipo Struct o que torna o código abaixo válido:

Teste teste1 = new()
{
    Nome = "Jose",
    Sobrenome = "Macoratti"
};
var teste2 = teste1 with { Nome = "Maria" };
Console.WriteLine(teste2.Nome);
Console.ReadKey();
public struct Teste
{
    public string Nome { get; set; }
    public string Sobrenome { get; set; }
}

 

Assim agora temos esse recurso também suportado nas Structs.

E estamos conversados...

"Guia-me na tua verdade, e ensina-me, pois tu és o Deus da minha salvação; por ti estou esperando todo o dia."
Salmos 25:5

Referências:


José Carlos Macoratti