C#泛型方法/多态性

3

我有以下代码用于关闭流。

void CloseStream(Stream s)
{
    if (s != null)
        s.Close();
}

void CloseStream(HttpWebResponse s)
{
    if (s != null)
        s.Close();
}

void CloseStream(StreamReader s)
{
    if (s != null)
        s.Close();
}

这段代码运行良好,但如果可能的话,我希望重构这三个方法。 理想情况下,该方法应如下所示:

void CloseStream(Object obj)
{
    obj.Close();
}

但是我无法执行 obj.Close(),因为 Object 类没有实现这样的方法。所以我想知道你们中是否有任何想法来解决它。

感谢您的时间, Kevin

3个回答

9

所有这些“流”都是可处理的,所以请使用Dispose()而不是Close()

void CloseStream(IDisposable s)
{
    if (s != null)
        s.Dispose();
}

同时考虑使用内置于.NET Framework的功能 - using语句将自动处理可释放对象的释放,无需调用CloseStream等方法:

using(StreamReader reader = File.OpenText(path))// create disposable here
{
    // use disposable
}

这段代码会自动检查 disposable 是否不是 null 并在 using 块结束时释放它。块上方的代码将编译成:

StreamReader reader = File.OpenText(path);

try
{
    // use disposable
}
finally // will be executed even in case of exception
{
   if (reader != null)
      reader.Dispose(); // internally calls Close()
}

1
谢谢,正是我所需要的 :) - kevinm

4

这三个类都实现了IDisposable,且Dispose方法会关闭底层流,因此你可以调用该方法:

void CloseStream(IDisposable s)
{
    if (s != null)
        s.Dispose();
}

0

它们都应该实现IDisposable,该接口实现了Dispose方法(与Close执行相同的工作)。

因此,请尝试:

void CloseStream(IDispsable obj)
{
    obj.Dispose();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接