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