C# Как обновить readonly-поле с помощью UnsafeAccessor
Узнайте, как в C# обновить readonly-поле с помощью UnsafeAccessor — альтернативы рефлексии без потерь производительности. Доступно в .NET 8.
Unsafe accessors можно использовать для доступа к приватным членам класса так же, как это делается через рефлексию. То же самое касается и изменения значения readonly-поля.
Рассмотрим следующий класс:
class Foo
{
public readonly int readonlyField = 3;
}
Допустим, по какой-то причине вы хотите изменить значение этого поля только для чтения. С помощью рефлексии это, конечно, уже было возможно:
var instance = new Foo();
typeof(Foo)
.GetField("readonlyField", BindingFlags.Instance | BindingFlags.Public)
.SetValue(instance, 42);
Console.WriteLine(instance.readonlyField); // 42
Но того же самого можно добиться с помощью UnsafeAccessorAttribute, без потерь производительности, связанных с рефлексией. С точки зрения unsafe accessors изменение readonly-полей ничем не отличается от изменения любого другого поля.
var instance = new Foo();
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "readonlyField")]
extern static ref int ReadonlyField(Foo @this);
ReadonlyField(instance) = 42;
Console.WriteLine(instance.readonlyField); // 42
Этот код также доступен на GitHub, если вы хотите попробовать его в деле.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.