gpt4 book ai didi

c# - 如何将通用 "T Value"标记为可以处理?

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:48 24 4
gpt4 key购买 nike

我创建了一个类 BinaryTree<T> .我写了以下内容来处理它:

public override void Dispose()
{
this.Key = null;
//delete this.Value;
if(this.LeftLeaf != null) this.LeftLeaf.Dispose();
this.LeftLeaf = null;
if(this.RightLeaf != null) this.RightLeaf.Dispose();
this.RightLeaf = null;
base.Dispose();
}

我的问题是如何将“T 值”标记为可以处置?我不能将它设置为 null,因为你不能将泛型设置为 null。 T 可能是一个巨大的类,但它可能没有使用 IDisposable所以你不能调用Dispose在上面。因为这是写成“不安全”类的“安全”类,所以我不相信 GC 会发现它不再被使用。

最佳答案

如果出于某种原因你正在编写一个通用集合,你知道集合中的元素将实现 IDisposable 并且集合将负责处理它们(这通常是您不希望收集的东西)那么您应该添加通用约束 where T : IDisposable 以便您可以处理所有项目。

当谈到正常的托管类型集合时,与非托管资源相反,您不需要做任何事情。无需将字段设置为 null,或将值设置为 null。如果整个集合未在任何地方被引用,那么 GC 将收集它,以及任何未在任何地方被引用的值,即使您没有清空所有字段也是如此。

I don't trust GC to figure out it's not being used anymore

这将使 C# 作为一种语言对您来说几乎无法使用。按照设计,您不仅不必手动释放托管资源,而且不能即使您想要。您无法强制立即清理托管对象。您只能手动清理非托管 资源。如果出于某种原因,这对您的应用程序来说是 Not Acceptable ,并且您必须完全控制程序的内存管理,您将希望使用其他一些具有更明确内存管理的语言(或者可能用另一种语言编写一些特别敏感的部分,其余部分与 C# 互操作)。

关于c# - 如何将通用 "T Value"标记为可以处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20749399/

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