C# como atualizar um campo readonly usando UnsafeAccessor
Aprenda a atualizar um campo readonly em C# usando UnsafeAccessor, uma alternativa à reflexão sem a penalidade de desempenho. Disponível no .NET 8.
Os unsafe accessors podem ser usados para acessar membros privados de uma classe, exatamente como você faria com reflexão. O mesmo vale para alterar o valor de um campo readonly.
Vamos supor a seguinte classe:
class Foo
{
public readonly int readonlyField = 3;
}
Imagine que por algum motivo você queira alterar o valor desse campo somente leitura. Já era possível fazer isso com reflexão, claro:
var instance = new Foo();
typeof(Foo)
.GetField("readonlyField", BindingFlags.Instance | BindingFlags.Public)
.SetValue(instance, 42);
Console.WriteLine(instance.readonlyField); // 42
Mas a mesma coisa pode ser feita usando UnsafeAccessorAttribute, sem a penalidade de desempenho associada à reflexão. Modificar campos readonly não é diferente de modificar qualquer outro campo quando se fala em unsafe accessors.
var instance = new Foo();
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "readonlyField")]
extern static ref int ReadonlyField(Foo @this);
ReadonlyField(instance) = 42;
Console.WriteLine(instance.readonlyField); // 42
Esse código também está disponível no GitHub, caso você queira testá-lo.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.