gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:30:05 28 4
gpt4 key购买 nike

我有一些类似的代码:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com