C# UnsafeAccessor で readonly フィールドを更新する方法
C# で UnsafeAccessor を使って readonly フィールドを更新する方法を解説します。リフレクションのパフォーマンスペナルティのない代替手段で、.NET 8 で利用できます。
unsafe accessor は、リフレクションと同じようにクラスのプライベートメンバーへアクセスするのに使えます。そして、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 accessor の観点では、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.