我有一些类似的代码:
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/