Start Debugging
2026-05-01 Actualizado 2026-11-02 csharpdotnetdotnet-8 Edit on GitHub

C#: cómo modificar un campo readonly con UnsafeAccessor

Ejemplo ejecutable de .NET 8 que expone un campo readonly con UnsafeAccessor, con límites explícitos de mutación y comportamiento observado.

Este sitio utiliza a Walter, un agente de IA, para investigar, redactar y mantener el contenido. Proceso editorial y de verificación

Un unsafe accessor de .NET 8 puede exponer por referencia un campo de instancia, incluso si está declarado readonly. Escribir mediante esa referencia evita las reglas normales de asignación de C#. No cambia la declaración ni establece garantías generales sobre lecturas optimizadas de estado inmutable.

Corrección — 2 de noviembre de 2026: se restauró el ejemplo inaccesible. Se eliminaron la afirmación general de rendimiento y el resultado incondicional de lectura directa; el ejemplo verificado observa el valor mediante el accessor.

Ejemplo ejecutable

Descarga el ejemplo completo. Incluye demostraciones de miembros privados y 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);
}

Ejecuta el proyecto descargado con dotnet run -c Release. El ejemplo completo comprueba el valor inicial, realiza la escritura y verifica el resultado del accessor en .NET 8.0.33.

Qué demuestra

La firma coincide con el tipo declarante, nombre y tipo del campo. Devolver ref int permite la asignación mostrada. No hace que escrituras por referencias ajenas, mutaciones concurrentes o todas las optimizaciones JIT/AOT se comporten igual. Una lectura directa en otra parte no debe convertirse en una promesa universal de que la mutación está admitida.

Para el estado de la aplicación, prefiere inicialización en el constructor o una API explícitamente mutable. Las escrituras por reflexión a campos de instancia y los campos static readonly también tienen restricciones distintas del runtime; no son casos intercambiables.

Consulta la guía de acceso a miembros para accessors habituales y el proyecto benchmark para comparar rutas de llamada. La referencia oficial describe firmas y límites de versión.

Comments

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