我想在函数中使用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?