CSharp - 声明类或者接口的IDisposable?

  显示原文与译文双语对照的内容
0 0

起始于follwing概况:

public interface ISample
{
}
public class SampleA : ISample
{
   // has some (unmanaged) resources that needs to be disposed
}
public class SampleB : ISample
{
   // has no resources that needs to be disposed
}

该类应实现该接口SampleA IDisposable用于释放资源。 你能解决这问题的方法有两种:

1 。 添加所需的接口到类SampleA :

public class SampleA : ISample, IDisposable
{
   // has some (unmanaged) resources that needs to be disposed
}

2 。 将其添加到接口ISample和强制派生类实现它:

public interface ISample : IDisposable
{
}

如果你把它放入任何实现该接口可以强制实施IDisposable即使它们根本不需要dispose 。 另一方面,非常清楚的看到接口的具体实现需要dispose/using块并无需强制转换为IDisposable清场。 可能会有一些更多的中pros/cons也一样。 为什么要建议你使用其中一种方式更受欢迎?

时间:原作者:9个回答

0 0

如果要采用 using(){}最好有模式应用于所有的接口 ISample派生自 IDisposable因为根据经验,在设计接口很偏向 " 易用性" 通过 " 轻松实现" 。

原作者:
0 0

就我个人而言,如果所有 ISample是应该一次性我还应该把它放到接口,如果只有某些是我只会将其放到类好战的性格又来了

听起来你有后一种情况。

原作者:
0 0

idispoable成为非常通用接口,具有界面,陈氏究从中继承。 在代码中你会因此避免类型检查在才花了有一个no op中实现某些ISample实现。 所以你的第2 选择可能更好从此的观点。

原作者:
0 0

一个接口, IFoo也许应该实现 IDisposable如果有可能我一直在某些实现将实现 IDisposable至少,并在有些情况下幸存的最后一个引用类型的实例将存储在变量或字段, IFoo. 应该基本上可以实现 IDisposable如果有实现可能会实现 IDisposable通过工厂的接口( 如同实例和实例将被创建 IEnumerator<T>,多数情况下是通过工厂创建接口 IEnumerable<T>) 。

比较 IEnumerable<T>IEnumerator<T>是具有启发性的。 某些类型的实现 IEnumerable<T>还实现了 IDisposable,但是代码用于创建这些类型的实例就会知道他们是什么,他们知道他们需要处理并将它们用作特定类型。 这种情况下可能是传送给其他例程的类型 IEnumerable<T>和那些其他例程会最终却一点都不知道该对象是需要释放的,但 这些其他例程会在大多数情况下不被上次的数字来保存对该对象的引用 . 与此相对,实例 IEnumerator<T>通常这些实例的创建,使用和最终放弃,由代码一无所知的基础类型,因为这不只是它们返回的 IEnumerable<T>. 部分的实现, IEnumerable<T>.GetEnumerator()方法的实现, IEnumerator<T>如果他们会泄露资源 IDisposable.Dispose方法不在被废弃之前,大部分代码调用该函数接受的参数类型 IEnumerable<T>将无从得知如果这样的类型可能会传递给它。 虽然是非常有可能的。 IEnumerable<T>使其包含一个属性 EnumeratorTypeNeedsDisposal以指示返回的 IEnumerator<T>将面临被释放,或者干脆要求例程调用 GetEnumerator()检查返回的对象的类型来确认是否可以实现 IDisposable,是更快更容易无条件调用 Dispose方法,该方法可能比来决定不做的话, Dispose有必要并调用,仅当是这样。

原作者:
0 0

按照 Inteface Segregation PrincipleSOLID 如果添加IDisposable到界面- 这是方法的客户端并不感兴趣,因此应将其添加到A 。

此外,接口不能为一次性因为人或者弃儿都是相关使用接口的具体实现,不能使用接口本身。

实现任何接口操作有可能包含或不包含元素,需要释放。

原作者:
0 0

我个人觉得选择1 时,除非具体示例为两个。 两个是一个好例子 IList.

一个 IList意味着你需要实现索引器给你们留念 howEVER,一个 IList实际上还意味着你是个 IEnumerable,你应该有一个 GetEnumerator()为类。

根据你的情况你是hesistant的类来实现 ISample将需要实现 IDisposable,如果不是每个类可实现所选接口必须实现 IDisposable那就不要逼他们。

关注 IDispoable具体而言, IDispoable特别是强制程序员使用类编写一些相当丑陋的代码。 例如,

foreach(item in IEnumerable<ISample> items)
{
    try
    {
        // Do stuff with item
    }
    finally
    {
        IDisposable amIDisposable = item as IDisposable;
        if(amIDisposable != null)
            amIDisposable.Dispose();  
    }
}

不仅是可怕的代码,则会有显著的性能损失在确保有一个finally块释放该项对每一个迭代该列表,即使 Dispose()只是今年上半年实现。

在这里粘贴的代码来回答一个评论,更易于阅读。

原作者:
...