Start Debugging
PT-BR
2026-05-01 Atualizado 2026-11-02 csharpdotnetdotnet-8 Edit on GitHub

C#: como alterar um campo readonly com UnsafeAccessor

Exemplo executável .NET 8 de um campo readonly exposto por UnsafeAccessor, com limites explícitos de mutação e comportamento observado.

Este site usa Walter, um agente de IA, para pesquisa, redação e manutenção. Processo editorial e de verificação

Um unsafe accessor do .NET 8 pode expor por referência um campo de instância, inclusive declarado readonly. Escrever por essa referência contorna as regras normais de atribuição do C#. Isso não muda a declaração nem estabelece garantias gerais sobre leituras otimizadas de estado imutável.

Correção — 2 de novembro de 2026: o exemplo indisponível foi restaurado. Foram removidos a alegação genérica de desempenho e o resultado incondicional da leitura direta; o exemplo verificado observa o valor pelo accessor.

Exemplo executável

Baixe o exemplo completo. Ele inclui demonstrações de membros privados e este caso readonly:

using System.Runtime.CompilerServices;

var holder = new ReadonlyHolder();
Accessors.ReadonlyField(holder) = 42;
Console.WriteLine(Accessors.ReadonlyField(holder)); // 42 in the verified run

internal sealed class ReadonlyHolder
{
    public readonly int Value = 3;
}

internal static class Accessors
{
    [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "Value")]
    internal static extern ref int ReadonlyField(ReadonlyHolder instance);
}

Execute o projeto baixado com dotnet run -c Release. O exemplo completo verifica o valor inicial, faz a escrita e confere o resultado pelo accessor no .NET 8.0.33.

O que isso demonstra

A assinatura corresponde ao tipo declarante, nome e tipo do campo. Retornar ref int permite a atribuição mostrada. Isso não faz escritas por outras referências, mutação concorrente ou todas as otimizações JIT/AOT se comportarem igualmente. Uma leitura direta em outro lugar não deve ser usada como promessa universal de mutação suportada.

Para estado da aplicação, prefira inicialização no construtor ou uma API explicitamente mutável. Escritas por reflexão em campos de instância e campos static readonly também têm restrições diferentes do runtime; não são casos intercambiáveis.

Veja o guia de acesso a membros para accessors comuns e o projeto benchmark para comparar caminhos de chamada. A referência oficial descreve assinaturas e limites de versão.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.