当前位置: 首页 > 编程语言 > C#

确定IDisposable是否应扩展接口或在实现所述接口的类上实现分享

时间:2023-04-11 00:38:27 C#

C#学习教程:DeterminingwhetherIDisposableshouldextendaninterfaceorbeimplementedonaclassthatimplementssaidinterface我的IDisposable接口还是在实现我的接口的类上实现IDisposable?我有一个不需要处理任何外部资源的接口,除了特定的实现。我的选择似乎是:1)在接口上实现IDisposable,要求所有实现都实现Dispose,即使它只是一个空方法。-或-2)仅在需要处理资源的类上实现IDisposable。这将导致“使用”问题,因为我的对象是从工厂创建的,所以所有上游代码都在接口上工作。由于接口未绑定到IDisposable,“使用”将看不到Dispose方法。但是,我可以将工厂结果转换为实现;然而,这会使消费者意识到实现,从而违背了界面的目的。关于最佳实践的任何想法?如果您希望调用者只能与接口交互,而不能与实现交互,那么您希望接口扩展IDisposable。如果不是,他们将需要检查该值是否为IDisposable以查看是否需要处置。如果负责处理对象的对象知道具体实现,并且只有对象使用到它的接口(但不负责处理它),那么考虑第二种方案。第一个选项的一个很好的例子是IEnumerator。许多IEnumerator对象在处理时不需要做任何事情,但有些不需要,因此接口扩展IDisposable因为负责该对象的创建/生命周期的对象将(或应该)永远不知道底层实现。第二个例子像IComparer,很多需要比较的对象都是一次性的,但是通过接口使用对象的那部分代码并不负责它的创建/生命周期,所以不需要知道是不是那个类型是一次性的。50,000美元的问题是处置责任是否会与接口一起传递,或者换句话说,最后一个使用实施对象的实体是否可能不是创建它的实体。IEnumerator实现IDisposable的一个重要原因是实现对象是由实现IEnumerable.GetEnumerator()的对象创建的,但通常由其他对象使用。实现IEnumerable的对象将知道它返回的内容是否真的需要处理,但无法知道接收者何时完成处理。调用IEnumerable.GetEnumerator()的代码将知道它何时处理完返回的对象,但无法知道是否需要进行任何清理。明智的做法是指定需要调用IEnumerable.GetEnumerator()的代码,以确保返回的对象在被丢弃之前调用Dispose;在许多情况下,Dispose方法只会无条件地调用保证存在的无操作方法比检查不存在的方法是否存在更便宜。如果接口类型的性质使得是否以及何时需要清理实现对象的问题将由同一实体负责,则接口不需要继承IDisposable。如果实例将由一个实体创建但最终由另一个实体使用,则inheritIDisposable将是明智的。如果在具体类上实现了IDisposable,并且接口的用户知道它可能是Disposable;你可以做IFoofoo=Factory.Create("type");使用(foo作为IDisposable){foo.bar();如果foo未实现IDisposable,则using将等同于using(null),这将正常工作。下面示例程序的输出为Fizz.BarFizz.DisposeBuzz.Bar示例程序以上是C#学习教程的全部内容:判断IDisposable是否应该扩展接口或者在实现该接口的类上实现共享,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——usingSystem;内部接口IFoo{voidBar();}内部类Fizz:IFoo,IDisposable{publicvoidDispose(){Console.WriteLine("Fizz.Dispose");}publicvoidBar(){Console.WriteLine("Fizz.Bar");}}内部类Buzz:IFoo{publicvoidBar(){Console.WriteLine("Buzz.Bar");}}internalstaticclassFactory{publicstaticIFooCreate(stringtype){switch(type){case"fizz":returnnewFizz();案例“嗡嗡声”:返回新的嗡嗡声();}返回空值;}}publicclassProgram{publicstaticvoidMain(string[]args){IFoofizz=Factory.Create("fizz");IFoobuzz=Factory.Create("buzz");使用(fizz作为IDisposable){fizz.Bar();(作为IDisposable的嗡嗡声){buzz.Bar();}控制台.ReadLine();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: