LoginSignup
0
0

ねぇ、なんでデリゲートは参照型なの?

Posted at

普通に値型にできる気がする。

参照型にしてもGCの仕事増やすだけじゃん。

public readonly unsafe struct ValueAction<T>
{
    readonly delegate* managed<object, T, void> _d;
    readonly object _i;

    private ValueAction(delegate* managed<object, T, void> d, object i)
    {
        _d = d;
        _i = i;
    }

    public void Invoke(T value) => _d(_i, value);

    public static ValueAction<T> Get(Action<T> from)
    {
        var method = from.Method;
        if (method.IsStatic) throw new ArgumentException();
        return new((delegate* managed<object, T, void>)method.MethodHandle.GetFunctionPointer(), from.Target);
    }
    public static ValueAction<T> Get<TTarget>(delegate* managed<TTarget, T, void> pointer, TTarget target) where TTarget : class
    {
        return new((delegate* managed<object, T, void>)pointer, target);
    }
}

当然静的メソッドはカリー化を挟む必要があるし、マルチキャストも出来ないけど、シンプルな用途ならこれで十分。


この記事によるとデリゲートは参照型の上に必要最低限のメンバの二倍のメンバを持っているらしく、ますます意味不明。(もちろん用途は理解できるが、あえて標準的に装備する必要があるほどのものかは謎)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0