Start Debugging

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.

< Назад