C# ref参数的引用

C# ref参数的引用,c#,reference,C#,Reference,我想在函数中使用ref参数的heap address(reference)值。该值必须是引用的值,而不是某个时间点的指针值,以克服GC压缩地址的移动 这个装置的来源是能够在一个函数中缓存表达式的值,该函数将表达式与ref值一起获取,ref值对于我的需要来说是唯一的 具体地说,以下代码是用于实现INotifyPropertyChanged属性的通用setter protectedvoid SetIfUpdated(ref T backingField,T newValue,Expression)

我想在函数中使用ref参数的heap address(reference)值。该值必须是引用的值,而不是某个时间点的指针值,以克服GC压缩地址的移动

这个装置的来源是能够在一个函数中缓存表达式的值,该函数将表达式与ref值一起获取,ref值对于我的需要来说是唯一的

具体地说,以下代码是用于实现INotifyPropertyChanged属性的通用setter

protectedvoid SetIfUpdated(ref T backingField,T newValue,Expression)
{
如果(/*新旧值比较*/)
{
返回;
}
backingField=newValue;
NotifyPropertyChanged(这是ReflectionAssist.GetName(表达式));
}
缺点是频繁更新属性(表达式操作)的成本太高,因此此代码的用户需要(静态地)缓存属性本身的名称。更有用的解决方案是缓存表达式的值,键是ref参数的地址

protectedvoid SetIfUpdated(ref T backingField,T newValue,Expression)
{
如果(/*新旧值比较*/)
{
返回;
}
backingField=newValue;
NotifyPropertyChanged(本词典[AddressOf(ref backingField)]);
}

那么,有没有一种足够好的方法可以做到这一点,而不必深入研究GC的非托管API,也不必使用调试器/探查器API?

您确定这会花费太多吗?您是否已经测试并分析过这一点?对我来说似乎是过早的优化。。。(另外,您是否查看了新的
CallerMemberName
属性?)这还不算过早测试和分析。另外,CallerMemberName将解决这个问题,是的,但我们落后了一个版本。(你为什么要把我所有的自我厌恶的评论都拿走?人们需要知道我讨厌自己问这个问题!)你能允许自己再进行一次间接操作,并将T限制在一个包装类中,比如
BackingFieldWrapper
?然后包装器类可以保存表达式或guid。