Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 流的通用IDisposable包装器-捕获所有异常的替代方法_C#_.net - Fatal编程技术网

C# 流的通用IDisposable包装器-捕获所有异常的替代方法

C# 流的通用IDisposable包装器-捕获所有异常的替代方法,c#,.net,C#,.net,因此,我刚刚为一个类型编写了这个实现,该类型抽象了一个文件,并在它包含的流上实现了IDisposable。其拟用于任何项目: public void Dispose() { if (_contentStream == null) return; lock (_contentStreamLocker) { if (_contentStream == null) return; try { _contentStream.Dispo

因此,我刚刚为一个类型编写了这个实现,该类型抽象了一个文件,并在它包含的流上实现了
IDisposable
。其拟用于任何项目:

public void Dispose()
{
  if (_contentStream == null)
    return;
  lock (_contentStreamLocker)
  {
    if (_contentStream == null)
      return;

    try
    {
      _contentStream.Dispose();
    }
    catch (Exception)
    {
      //legitimate? - don't let any exception prevent 
      //us from successfully disposing?
    }  
    _contentStream = null;
  }
}
很明显,我觉得自己很脏,因为:

  • 我正在捕获异常
  • 我没有做任何异常处理
但是,由于我不能保证底层流的行为(也要考虑自定义实现)——即,如果它已经被处理,或者如果它处于实现决定不可能处理的状态——我真的看不出还有什么可以做

显然,我不应该隐藏
Stream
Dispose()
的糟糕实现;但我认为这里有一个中途之家

特别是,这个对象不一定“拥有”流,因此不必总是负责
Dispose()
ing。因此,它应该能够容忍流被其他人处理的情况

显然,在大多数情况下,这不是一个问题;使用块获取
中的文件,读取它,对其进行处理,然后处理它。但也有一些边缘案例;他们打扰我了

最初我将其编写为
catch(ObjectDisposedException){}
——但这只是一种非正式的模式,也不能依赖

我该怎么办?保持这样,尽管例外吞咽是坏的因果报应?只吞咽
ObjectDisposedException
,即使这样也没什么好处?或者我应该一点也不例外地吞咽或处理吗


在所有情况下,我都能看到优点;一般来说,如果你不知道哪一个赢了,那是因为有一些有用的信息无法“一般”处理。在这种情况下,我认为最好让打电话的人来处理,因为他们将处于一个具体的情况下,这样他们可以更好地判断

这个流是如何引入这个类的?如果你能设计出这样的方式来传递信息,那么为什么不让打电话的人来处理它,而不去关心它呢。
StreamReader
承担了这个责任,这一直困扰着我。如果不是的话,我也不在乎


不要吞下例外情况,特别是在用于外部消费的代码中。

正如您所说,如果您没有一次性用品,则不应处置它。你甚至不应该临时打电话给Dispose

看看我的答案


更新
好的,你是否拥有一次性用品的问题并不是由谁创造的。所有权可以传递给其他类
StreamReader
在流传递给它时承担所有权。因此,流的创建者不必调用dispose,可以依靠
StreamReader
来完成这项工作。

我建议您要根据实现dispose模式,如果包装器的客户端在基本流上“拉地毯”,您应该让异常进入,以便他们能够处理它,或者,至少要知道这一点。

如果该流对您的类是私有的,您会怎么处理它?这条流公开了吗?@Jodrell-好问题-这条流可以被设置到对象中。该类实现了一个get/set接口,以便调用者可以填写文件对象并将其提供给服务,并从服务中检索文件及其流。该环境非常抽象。因为
StreamReader
将假定拥有它。你可以被传递一个流并夺走所有权。吞咽对象处理异常和最终确定异常是可以的。翻译:“潜在的默默泄漏资源和打破后条件是可以的”这是一个公平的观点。让打电话的人意识到他们搞砸了。