我有一些类似下面的代码:
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吗?
发布于 2009-08-07 15:04:43
将局部变量设置为null几乎总是错误的,除非您想在以后实际使用该值。它不会在更早的时候强制垃圾收集-如果您不打算稍后从变量中读取,垃圾收集器可以忽略引用(当不处于调试模式时)。
但是,关闭流几乎总是正确的-为简单起见,理想情况下是在using语句中。
像这样一个空的"catch“块也几乎总是错误的。您真的想处理任何出错的事情,包括像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吗?这是本地机器的默认编码-您通常需要由响应本身指示的编码。
发布于 2009-08-07 15:02:42
它应该有调用Dispose()的using。
发布于 2009-08-07 15:04:46
是的,Dispose()它们。
做一些像这样的事情会更好
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。
还要注意的是,以下几行代码与您的所有代码实现了相同的功能:
using (var client = new System.Net.WebClient())
{
client.Encoding = ...;
client.Credentials = ...;
return client.DownloadString("SomeUrl");
}https://stackoverflow.com/questions/1245269
复制相似问题