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 并且不使用 Debugger/Profiler API?

4

0 回答 0