2

関数内で ref 引数のヒープ アドレス (参照) の値を使用したいと考えています。値は、GC 圧縮アドレスの移動を克服するために、ある時点でのポインター値ではなく、参照の値である必要があります。

この仕掛けの原因は、ref 値と一緒に式を取得する関数で、式の値をキャッシュできるようにすることでした。これは、私のニーズに対して十分に一意です。

具体的には、次のコードは INotifyPropertyChanged プロパティを実装するための汎用セッターです。

protected void SetIfUpdated<T>(ref T backingField, T newValue, Expression<Func<T>> expression)
{
    if (/*old and new value comparison*/)
    {
        return;
    }
    backingField = newValue;
    NotifyPropertyChanged(this, ReflectionAssist.GetName(expression));
}

欠点は、プロパティの頻繁な更新 (式の操作) にコストがかかりすぎることです。そのため、このコードのユーザーは、プロパティの名前を (静的に) キャッシュする必要があります。より使いやすい解決策は、キーが ref 引数のアドレスである式の値をキャッシュすることでした。

protected void SetIfUpdated<T>(ref T backingField, T newValue, Expression<Func<T>> expression)
{
    if (/*old and new value comparison*/)
    {
        return;
    }
    backingField = newValue;
    NotifyPropertyChanged(this, _Dictionary[AddressOf(ref backingField)]);
}

では、GC のアンマネージ API を掘り下げたり、デバッガー/プロファイラー API を使用したりせずに、これを行うのに十分な方法はありますか?

4

0 に答える 0