Indicar membros como sendo “readonly” em “structs” torna o código mais expressivo e performático

Em C#, tipos struct ficam armazenados na Stack e não na Heap. Por isso, são extremamente importantes, principalmente em aplicações onde a performance é aspecto crítico.

Por definição, tipos struct deveriam ser sempre imutáveis. Entretanto, há cenários onde faz sentido projetá-los suportando mutabilidade. Eles são perfeitos para a implementação de value objects do DDD e, também, são ótima alternativa para superação da utilização excessiva de tipos tipos primitivos.

A partir do C# 7.2, é possível marcar uma struct com o modificador readonly.

public readonly struct Point3
{
    public Point3(float x, float y, float z)
        => (X, Y, Z) = (x, y, z);

    public float X { get; }
    public float Y { get; }
    public float Z { get; }

    public override string ToString()
        => $"{X}; {Y}; {Z}";
}

Esse recurso permite ao programador confirmar sua intenção de manter a struct imutável e, também, ao compilador aplicar otimizações importantes.

Por padrão, o compilador decide por criar “cópias de segurança” de tipos struct potencialmente mutáveis, defensivamente, em alguns cenários. Obviamente, esta “postura defensiva” gera overhead de processamento perceptível.

Marcar uma struct com readonly previne que o compilador adote essa “postura defensiva” e melhora a performance.

Eventualmente, entretanto, precisaremos criar tipos struct que sejam mutáveis (?!).

Importante destacar que tipos struct devem ser imutáveis na grande maioria das situações. [tweet]A necessidade de tornar, por alguma razão, um tipo struct mutável é forte indício de falha de design.[/tweet]

Agora, a partir do C# 8, temos a possibilidade de marcar elementos e não, necessariamente, todo o tipo struct como imutável.

public struct Point2
{
    public Point2(float x, float y)
        => (X, Y) = (x, y);

    public float X { get; set; }
    public float Y { get; set; }

    public readonly double DistanceTo(Point2 other)
    {
        var dx = other.X - X;
        var dy = other.Y - Y;
        return Math.Sqrt(dx * dx + dy * dy);
    }

    public override readonly string ToString()
        => $"{X}; {Y}";
}

Essa nova feature, além de permitir que escrevamos códigos mais expressivos, previne que alteremos o estado de forma acidental e indesejada. Mais importante ainda, permite ao compilador adotar postura “menos defensiva” durante a execução desses membros impedindo eventuais “cópias de segurança” desnecessárias, melhorando a performance.

Compartilhe este insight:

Comentários

Participe deixando seu comentário sobre este artigo a seguir:

Subscribe
Notify of
guest
0 Comentários
Inline Feedbacks
View all comments

AUTOR

Elemar Júnior
Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e profissionais a gerar mais resultados através da tecnologia.

NOVOS HORIZONTES PARA O SEU NEGÓCIO

Nosso time está preparado para superar junto com você grandes desafios tecnológicos.

Entre em contato e vamos juntos utilizar a tecnologia do jeito certo para gerar mais resultados.

Insights EximiaCo

Confira os conteúdos de negócios e tecnologia desenvolvidos pelos nossos consultores:

Arquivo

Pós-pandemia, trabalho remoto e a retenção dos profissionais de TI

CTO Consulting e Especialista em Execução em TI
0
Queremos saber a sua opinião, deixe seu comentáriox

Muito obrigado!

Deu tudo certo com seu envio!
Logo entraremos em contato

Indicar membros como sendo “readonly” em “structs” torna o código mais expressivo e performático

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Indicar membros como sendo “readonly” em “structs” torna o código mais expressivo e performático

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Condição especial de pré-venda: R$ 14.000,00 - contratando a mentoria até até 31/01/2023 e R$ 15.000,00 - contratando a mentoria a partir de 01/02/2023, em até 12x com taxas.

Tenho interesse nessa capacitação

Para solicitar mais informações sobre essa capacitação para a sua empresa, preencha o formulário a seguir:

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

O seu insight foi excluído com sucesso!

O seu insight foi excluído e não está mais disponível.

O seu insight foi salvo com sucesso!

Ele está na fila de espera, aguardando ser revisado para ter sua publicação programada.

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse nessa solução

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse neste serviço

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

× Precisa de ajuda?