我如何继承IDisposable?类名已更改以保护无辜者。如果我有一个名为ISomeInterface的接口。我还有继承接口的类,FirstClass和SecondClass。FirstClass使用必须处理的资源。二等舱没有。那么问题来了,应该从哪里继承IDisposable呢?以下选项似乎都不理想:1)使FirstClassinheritanceIDisposable。然后,任何处理ISomeInterfaces的代码都必须知道是否要处理它们。这对我来说闻起来像是紧密耦合。2)使ISomeInterface继承IDisposable。然后,任何继承自它的类都必须实现IDisposable,即使没有什么可处理的。Dispose方法除了注释外基本上是空白的。#2对我来说似乎是正确的选择,但我想知道是否还有其他选择。如果抽象实体(接口或抽象类)有可能需要一次性使用,则应该实现它。例如,Stream本身不需要IDisposable,IEnumerator也不需要……抽象基类可能更简单,因为您可以使用Dispose()的默认(空)实现,也可以使用终结器/Dispose(bool)模式,它是voidIDisposable.Dispose(){Dispose(true);GC.SuppressFinalize(这个);}protectedvirtualvoidDispose(booldisposing){}~BaseType(){Dispose(false);}Interface如果你知道ISomeInterface的某些实现需要处理ShouldinheritIDisposable即使接口的具体实现没有任何要处理的的。例如,在BCL中,IDataReader实现了IDisposable,尽管可以想象数据读取器实现没有可处理的外部资源。这取决于您的界面,但我倾向于#2。如果您有两个ISomeInterface实现并且只需要处理一个,那么您需要重构。通常,当您绑定到一个接口时,最好使该接口inheritIDisposable而不是基类;如果您的接口不继承IDisposable,则必须强制转换为IDisposable以处理对象,冒着InvalidCast的风险...如果您希望所有代码都一般处理ISomeInterfaces,那么是的,它们都应该是一次性的。如果不是,那么创建FirstClass的代码应该处理它:否则,您始终可以使用这样的扩展方法:publicstaticvoidDisposeIfPossible(thisobjecto){IDisposabledisp=oasIDisposable;如果(disp!=null)disp.Dispose();}//...someObject.DisposeIfPossible();//对象上的扩展方法我还应该提到我更喜欢模板基类方法。我在这篇关于正确构建一次性产品的博文中介绍了这一点。我的建议是去根,而不是直接去具体类。第2点是root,你是由FirstClass的某种契约驱动的。如果你知道类必须实现某个接口,那么你要确保它们签订契约的接口继承IDisposable到目前为止写的所有答案都遗漏了一个关键点:只有基类型或基接口才能实现IDisposableifbasesmayberequired类实例的代码可能会在没有意识到的情况下取得它需要处理的实例的所有权。最常见的情况是工厂方法;一个典型的例子是IEnumerable/IEnumerator。大多数枚举数不需要清理,但调用IEnumerable.GetEnumerator的代码通常没有特别的理由相信返回的枚举数实际上需要清理,也不会认为它不需要清理。让IEnumerator的所有实现实现IDisposable,并让所有使用者对返回的枚举数调用Dispose,而不是让使用者检查返回的类型是否实现IDisposable并调用它(如果是),通常会更快。如果预期基类型引用通常仅由不负责清理相关项目的方法使用,则基类型不需要实现IDisposable。负责清理的代码将知道它正在处理的对象是否实现了IDisposable。以上就是C#学习教程:如何继承IDisposable?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
