ufcpp/UfcppSample

UnsafeAccessor

Opened this issue · 0 comments

ブログにでも書く?
C# 入門の雑記?

using System.Runtime.CompilerServices;

var p = new Private();
GetValue(p) = 99;
Console.WriteLine(p); // 99

// アクセス制限無視してメンバーにアクセスする手段を用意したらしい。
// 今まではリフレクション(IL Emit)でやりたい放題やってたけども、
// AOT (リフレクションをソースジェネレーターで置き換えたい)で困るからって。
//
// ランタイム側で UnsafeAccessor 属性付きの external メソッドを特別扱い(intrinsic)してる。
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_value")]
extern static ref int GetValue(Private x);

class Private
{
    private int _value; // Make field readonly 出っぱなしにはなる。

    public override string ToString() => _value.ToString();
}

基本的には AOT 向け。
シリアライザーで使うのが一番の動機。

単体テストとかにも使えそう。 → すでに neue さんが
InternalVisibleTo は広範囲にわたって公開されすぎる感ある。
Visual Studio は昔 internal accessor (中身はリフレクション)とか生成してくれる機能持ってたのに気が付いたら消えてた。