関数内で 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 を使用したりせずに、これを行うのに十分な方法はありますか?