我是ConditionalWeakTable
的粉丝。这真的很棒。它本质上允许您将一个引用与另一个引用相关联/附加/配对,所有这些都是线程安全的。
它为我解答了很多问题/问题。不幸的是,我似乎有一个问题,我继续遇到,并且无法找到一个好的答案。
我们说我有一个方法(用下面的测试方法表示),我使用的是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
中的条目也保持活动状态,并保持活动直到其所有子对象/内部引用声称。
(在考虑这个问题和可能的解决方案时,如果有WeakHashSet
可以某种方式用作Dictionary<>
的关键字,它会很棒,但是来自某些人搜索时,.NET中似乎不存在WeakHashSet
。)
希望这可以概括我的困境。我基本上想要使用ConditionalWeakTable
(或一些等价物)来存储关联的值(作为键/值条目),而不是使用一个(弱)引用作为条目的键,我会喜欢使用两个(或更多)。
我希望实现的目标是什么(无需编写大量自定义代码)?
答案 0 :(得分:0)
这个问题与CSS negation pseudo-class (:not()
)有关,我终于找到了解决这个问题的答案,而且答案很顺利。您可以阅读答案以获取更多详细信息。
关于这个问题。它归结为更精致/聪明/智能地使用&#34;键&#34;用于<p data-label="Local">-Brasília/DF</p>
。就我而言,我正在与一个键的三个部分(实例,方法和参数)搏斗。我设法通过使用ConditionalWeakTable
(基本上是实例和方法的参考元组)来组合前两个,然后将其与使用this question的Delegate
配对。 Whalah。问题解决了。