ufcpp / UfcppSample

http://ufcpp.net/ 向けのサンプル
Apache License 2.0
133 stars 41 forks source link

UnsafeAccessor #455

Open ufcpp opened 8 months ago

ufcpp commented 8 months ago

ブログにでも書く? 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 (中身はリフレクション)とか生成してくれる機能持ってたのに気が付いたら消えてた。