参考ref参数

时间:2012-11-01 10:18:06

标签: c# reference

我想在函数中使用ref参数的堆地址(reference)值。该值必须是参考值,而不是一个时刻的指针值,以克服GC压缩地址移动。

这个装置的来源是能够在一个函数中缓存表达式的值,该函数将表达式与ref值一起使用,这将足以满足我的需求。

具体而言 - 以下代码是用于实现INotifyPropertyChanged属性的通用setter。

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?

0 个答案:

没有答案