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

Elemar Júnior

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. A necessidade de tornar, por alguma razão, um tipo struct mutável é forte indício de falha de design.

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.

Em resumo

O fato
Structs em C# deveriam ser sempre imutáveis! Sempre que projetamos uma”struct” dessa forma, devemos utilizar a marcação “readonly” no tipo, expressando nossa intenção e permitindo ao compilador aplicar otimizações.
A novidade
A partir do C# 8, em implementações de “structs” que, por alguma razão, precisam ser mutáveis, podemos marcar membros que não alteram o estado como “readonly”. Dessa maneira, deixamos nosso código mais expressivo e permitimos que o compilador aplique otimizações importantes.
Os benefícios
Alem de tornar o código mais expressivo, marcar tipos ou membros como “readonly” permite ao compilador implementar otimizações importantes que podem ter impacto significativo na 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:

Arquitetura de Dados

Insights de um DBA na análise de um plano de execução

Especialista em performance de Bancos de Dados de larga escala
Arquitetura de Software

Estratégias para modernização do legado

Desenvolvedor .NET/NodeJs e especialista em Kafka com experiência em startups e grandes empresas
Infraestrutura e Nuvem

Migração para a nuvem, mais do que mudança tecnológica, implica em mudança da cultura organizacional

Engenheiro de nuvem, arquiteto de software e especialista em Containers e Devops

Acesse nossos canais

Simplificamos, potencializamos e aceleramos resultados usando a tecnologia do jeito certo

EximiaCo 2022 – Todos os direitos reservados

0
Queremos saber a sua opinião, deixe seu comentáriox
()
x

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?