c# - Stream.Dispose 还是 stream=null?

标签 c# .net

我有一些类似的代码:

HttpWebRequest req;
HttpWebResponse response;
Stream receiveStream = null;
StreamReader readStream = null;
try
{
    req = (HttpWebRequest)WebRequest.Create("someUrl"));
    req.Credentials = CredentialCache.DefaultCredentials;

    req.Method = "GET";

    response = (HttpWebResponse)req.GetResponse();
    receiveStream = response.GetResponseStream();
    readStream = new StreamReader(receiveStream, Encoding.Default);

    return readStream.ReadToEnd();
}
catch
{
    return "Error";
}
finally 
{
    readStream = null;
    receiveStream = null;
    response = null;
    req = null;
}

此代码是否应具有 readStream.Dispose() 和 responseStream.Dispose() 而不是将两者都设置为 null?

最佳答案

将局部变量设置为 null 几乎总是错误的,除非你想稍后实际使用该值。它不会更早地强制进行垃圾收集 - 如果您稍后不打算从变量中读取,垃圾收集器可以忽略该引用(当不处于 Debug模式时)。

但是,关闭流几乎总是正确的 - 为简单起见,最好在 using 语句中。

还有像这样一个简单的“catch” block 几乎总是错误的。您真的想要处理任何出错的事情,包括诸如 OutOfMemoryException 之类的事情吗?

我会将您的代码重写为:

HttpWebRequest req = (HttpWebRequest) WebRequest.Create("someUrl"));
req.Credentials = CredentialCache.DefaultCredentials;
req.Method = "GET";

using (WebResponse response = req.GetResponse())
{
    using (StreamReader reader = new StreamReader(response.GetResponseStream(),
                                                  Encoding.Default))
    {
        return reader.ReadToEnd();
    }
}

现在如果出现问题,异常将传播给调用者。您可能想要捕获一些特定异常,但使用可能是有效“正常”响应的值来表示错误通常不是一个好主意。

最后,您真的确定要 Encoding.Default 吗?这是本地机器的默认编码 - 您通常需要响应本身指示的编码。

关于c# - Stream.Dispose 还是 stream=null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1245269/

相关文章:

c# - 读取 CSV 文件并将值存储到数组中

javascript - Razor View 引擎 : Complex looping with JS

c# - 从特殊文件夹 C# 检索所有文件的方法

c# - 为什么 New Relic 在慢速网络事务下列出 "/System.ServiceModel.Activation.AspNetRouteServiceHttpHandler"?

c# - 对复制下数据库模式的持续开发的建议

c# - 如何列出目录中的所有文件 Silverlight

c# - C# int 和仅包含 int 的结构之间的实际和理论差异

c# - 如何在 C# 中访问匿名类型的属性?

c# - SQL Server Express 版本问题

c# - 动态合并 2 个类