首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Stream.Dispose还是stream=null?

Stream.Dispose还是stream=null?
EN

Stack Overflow用户
提问于 2009-08-07 15:01:40
回答 11查看 3.4K关注 0票数 11

我有一些类似下面的代码:

代码语言:javascript
运行
复制
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吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-08-07 15:04:43

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

但是,关闭流几乎总是正确的-为简单起见,理想情况下是在using语句中。

像这样一个空的"catch“块也几乎总是错误的。您真的想处理任何出错的事情,包括像OutOfMemoryException这样的事情吗

我会将你的代码重写为:

代码语言:javascript
运行
复制
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吗?这是本地机器的默认编码-您通常需要由响应本身指示的编码。

票数 28
EN

Stack Overflow用户

发布于 2009-08-07 15:02:42

它应该有调用Dispose()using

票数 27
EN

Stack Overflow用户

发布于 2009-08-07 15:04:46

是的,Dispose()它们。

做一些像这样的事情会更好

代码语言:javascript
运行
复制
using (HttpWebResponse response = (HttpWebResponse)req.GetResponse() )
using (Stream receiveStream = response.GetResponseStream() )
using (readStream = new StreamReader(receiveStream, Encoding.Default) )
{
   return readStream.ReadToEnd();
}

using(x) {}块将被重写(由编译器重写)

作为try {} finally {x.Dispose();}

请注意,WebRequest不是IDisposable。

还要注意的是,以下几行代码与您的所有代码实现了相同的功能:

代码语言:javascript
运行
复制
using (var client = new System.Net.WebClient())
{
    client.Encoding = ...;
    client.Credentials = ...;
    return client.DownloadString("SomeUrl");
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1245269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档