gpt4 book ai didi

.net - 了解 ConditionalWeakTable

转载 作者:行者123 更新时间:2023-12-03 20:18:41 33 4
gpt4 key购买 nike

我想了解 ConditionalWeakTable .和有什么区别

class ClassA
{
static readonly ConditionalWeakTable<ClassA, OtherClass> OtherClassTable
= new ConditionalWeakTable<ClassA, OtherClass>();
}


class ClassB
{
OtherClass otherClass;
}

?使用 ClassA 或 ClassB 引用可空字段的优缺点是什么?

最佳答案

我不完全明白你在问什么,我想虽然你在问你是否应该在你的类型或 ConditionalWeakTable 中使用属性,您可以为该特定类型实例附加这样的属性。如果是这样,您也可以询问是否应该单独使用属性而不是字典,字典可以在特定键下包含此属性(这将是您的特定类型实例)。除非你需要这样的字典,否则这很废话。

了解ConditionalWeakTable<TKey, TValue> :

什么ConditionalWeakTable实际上,它允许您将附加信息附加到现有的、托管的、非动态的 CLR 对象。本质上它可以被理解为一个字典,其中键被弱引用,因此只要键还活着,值就会保持事件状态。更多信息请访问 MSDN .

所以,你应该问问自己,你的需求是什么。假设您的类型已实例化:

var classA = ClassA(); 
var classB = ClassB();
var other = OtherClass();

您是否想以这种方式使用绑定(bind)到此类实例的属性:
/* set */
var other = new OtherClass();
ClassA.OtherClassTable.Add(classA, other);
/* get */
OtherClass data = null;
var result = ClassA.OtherClassTable.TryGetValue(classA, out data);

而不是下面这个?
/* set */
classB.OtherClass = other;
/* get */
var result = classB.OtherClass;

除非有特殊需要,否则答案似乎很明显。这里当然还有其他问题:

什么是弱引用,为什么要使用它?

这个 MSDN文章简短地解释了这个话题。它基本上说弱引用不会延长对象的生命周期,因为一旦应用程序代码仍然可以访问这样的对象,它就可以被垃圾回收。弱引用可用于指向应该可用于 GC 的对象(如果它们没有被主动使用)。但是,如果程序使用大量小对象,弱引用会对内存使用产生负面影响。像 this 这样的主题和 this还应该澄清一些遗留的疑问。

如果您正在寻找示例,何时可以使用 ConditionalWeakTable<TKey, TValue>超标 Dictionary<TKey, TValue> ,想象以下情况。您希望在运行时将属性字典绑定(bind)到实例,但同时又不想在您停止主动使用它们时阻止它们被收集。不幸的是,在标准方法中这是不可能的 - GC 被阻止,因为字典仍然持有对它们的强引用,如下所示:
var x = new object();
x.Props().Y = "hello";

static class ExpandoExtensions
{
private static IDictionary<object, dynamic> props =
new Dictionary<object, dynamic>();
public static dynamic Props(this object key)
{
dynamic o;
if (!props.TryGetValue(key, out o)){
o = new ExpandoObject();
props[key] = o;
}
return o;
}
}

当然,您总是可以手动删除它们,但是下面显示的这种方法不是更简单吗?
static class ExpandoExtensions
{
private static readonly ConditionalWeakTable<object, ExpandoObject> props =
new ConditionalWeakTable<object, ExpandoObject>();

public static dynamic Props(this object key)
{
return props.GetOrCreateValue(key);
}
}

同时( MSDN)

avoid using weak references as an automatic solution to memory management problems. Instead, develop an effective caching policy for handling your application's objects.



上面显示的这些扩展方法取自 thread .

关于.net - 了解 ConditionalWeakTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465630/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com