Skip to content

UnsafeAccessor  #455

@ufcpp

Description

@ufcpp

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions