C#"使用"块

J B*_*min 5 c# design-patterns using stream streamreader

我有类似下面的代码...有人在这里提到WebClient,Stream和StreamReader对象都可以从使用块中受益.两个简单的问题:

1:这个小片段看起来如何使用块?我做自己的研究没有问题,所以资源链接很好但是看到一个例子会更快更容易,我会从中理解它.

2:我想养成良好的编码标准的习惯,如果我对使用积木更好的原因有所了解会有所帮助...是否只是让你不必担心关闭或在那里更多原因?谢谢!

WebClient client = new WebClient();
Stream stream = client.OpenRead(originGetterURL);
StreamReader reader = new StreamReader(stream);

JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
string encryptionKey = (string)jObject["key"];
string originURL = (string)jObject["origin_url"];

stream.Close()
reader.Close()
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 9

using (var client = new WebClient())
using (var stream = client.OpenRead(originGetterURL))
using (var reader = new StreamReader(stream))
{
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
    var encryptionKey = (string)jObject["key"];
    var originURL = (string)jObject["origin_url"];
}
Run Code Online (Sandbox Code Playgroud)

或者干脆:

using (var client = new WebClient())
{
    var json = client.DownloadString(originGetterURL);
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(json);
    var encryptionKey = (string)jObject["key"];
    var originURL = (string)jObject["origin_url"];
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么没有人告诉我,我可以使用一组花括号堆叠使用.为什么不?!?! (2认同)

hun*_*ter 5

using (WebClient client = new WebClient())
{
    // do work
}
Run Code Online (Sandbox Code Playgroud)

提供方便的语法,确保正确使用IDisposable对象.

来自MSDN:using Statement(C#Reference)


通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它.using语句以正确的方式调用对象上的Dispose方法,并且一旦调用Dispose,它也会导致对象本身超出范围.在using块中,该对象是只读的,不能修改或重新分配.


using语句确保即使在对象上调用方法时发生异常,也会调用Dispose.您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果; 实际上,这就是编译器如何翻译using语句.