是否可以将 ConditionalWeakTable 与元组键(或由多个引用组成的键)一起使用?
Is it Possible to Use ConditionalWeakTable with a Tuple Key (or a key comprised of multiple references)?
我是 ConditionalWeakTable
的忠实粉丝。真的很不错。它本质上允许您 associate/attach/pair 一个引用到另一个引用,同时是线程安全的。
它为我解答了很多 questions/problems。不幸的是,我似乎有一个问题,我继续 运行 进入,但未能找到好的答案。
假设我有一个方法(由下面的测试方法表示),我在其中使用 ConditionalWeakTable
,但我没有对密钥使用单个引用,而是需要组合两个项目并制作那把钥匙。这在下面通过 Key
对象显示(出于演示目的和简洁性,它只是扩展的 Tuple
):
[Fact]
public void TupleKey()
{
var first = new object();
var table = new ConditionalWeakTable<Key, object>();
var context = table.GetValue( new Key( first, new object() ), key => new object() );
// .. table has one entry here.
GC.Collect();
GC.WaitForPendingFinalizers();
Debugger.Break(); // Table is empty here.
}
class Key : Tuple<object, object>
{
public Key( object item1, object item2 ) : base( item1, item2 ) {}
}
调用 Debugger.Break
时,ConditionalWeakTable
为空,即使在测试方法中存在对 Key
的其中一个部分的活动引用。这是有道理的,因为在测试中找不到对 Key
的引用。
但是,由于对 Key
对象的其中一个部分有一个活动引用,我希望 ConditionalWeakTable
中的条目也保持活动状态,并保持活动状态直到所有它的 children/inner 参考文献已被声明。
(在考虑这个和可能的解决方案时,如果有一个 WeakHashSet
可以以某种方式用作 Dictionary<>
,但从某些搜索来看,.NET 中似乎不存在 WeakHashSet
。)
希望这概述了我的困境。我基本上想使用 ConditionalWeakTable
(或某种等效物)来存储关联的值(作为 key/value 条目),而不是使用一个(弱)引用作为条目的键,我想使用两个(或更多)。
我希望实现的目标是否可行(也就是说,无需编写大量自定义代码)?
这个问题与this question有关,我终于找到了解决这个问题的答案,那个问题也很好。您可以阅读答案了解更多详情。
关于这个问题。归结为更多 refined/clever/intelligent 使用 "key" 来使用 ConditionalWeakTable
。就我而言,我正在努力处理密钥的三个部分(实例、方法和参数)。我设法通过使用 Delegate
(它基本上是实例和方法的引用元组)将前两个组合起来,然后将其与使用 StructuralEqualityComparer
的 Dictionary<object[], object>
配对。哇哦。问题已解决。
我是 ConditionalWeakTable
的忠实粉丝。真的很不错。它本质上允许您 associate/attach/pair 一个引用到另一个引用,同时是线程安全的。
它为我解答了很多 questions/problems。不幸的是,我似乎有一个问题,我继续 运行 进入,但未能找到好的答案。
假设我有一个方法(由下面的测试方法表示),我在其中使用 ConditionalWeakTable
,但我没有对密钥使用单个引用,而是需要组合两个项目并制作那把钥匙。这在下面通过 Key
对象显示(出于演示目的和简洁性,它只是扩展的 Tuple
):
[Fact]
public void TupleKey()
{
var first = new object();
var table = new ConditionalWeakTable<Key, object>();
var context = table.GetValue( new Key( first, new object() ), key => new object() );
// .. table has one entry here.
GC.Collect();
GC.WaitForPendingFinalizers();
Debugger.Break(); // Table is empty here.
}
class Key : Tuple<object, object>
{
public Key( object item1, object item2 ) : base( item1, item2 ) {}
}
调用 Debugger.Break
时,ConditionalWeakTable
为空,即使在测试方法中存在对 Key
的其中一个部分的活动引用。这是有道理的,因为在测试中找不到对 Key
的引用。
但是,由于对 Key
对象的其中一个部分有一个活动引用,我希望 ConditionalWeakTable
中的条目也保持活动状态,并保持活动状态直到所有它的 children/inner 参考文献已被声明。
(在考虑这个和可能的解决方案时,如果有一个 WeakHashSet
可以以某种方式用作 Dictionary<>
,但从某些搜索来看,.NET 中似乎不存在 WeakHashSet
。)
希望这概述了我的困境。我基本上想使用 ConditionalWeakTable
(或某种等效物)来存储关联的值(作为 key/value 条目),而不是使用一个(弱)引用作为条目的键,我想使用两个(或更多)。
我希望实现的目标是否可行(也就是说,无需编写大量自定义代码)?
这个问题与this question有关,我终于找到了解决这个问题的答案,那个问题也很好。您可以阅读答案了解更多详情。
关于这个问题。归结为更多 refined/clever/intelligent 使用 "key" 来使用 ConditionalWeakTable
。就我而言,我正在努力处理密钥的三个部分(实例、方法和参数)。我设法通过使用 Delegate
(它基本上是实例和方法的引用元组)将前两个组合起来,然后将其与使用 StructuralEqualityComparer
的 Dictionary<object[], object>
配对。哇哦。问题已解决。