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.