我继承了以下代码:
using (var dataAccessConnection = da.GetConnection()) //no opening curly brace here using (var command = new sqlCommand(sql,dataAccessConnection.Connection)) { command.CommandType = CommandType.Text; using (var sqlDataReader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (sqlDataReader.Read()) { rueckgabe.Add(new Myclass { Uid = Guid.NewGuid(),ImportVersionUid = versionUid,MyProperty = Convert.ToInt32(sqlDataReader["MyProperty"]) }); } } command.Connection.Close(); dataAccessConnection.Connection.Close(); }
看一下代码,我在使用子句之后开了一个大括号.
代码编译并执行预期的操作.该应用程序的行为不可预测.有时它无法访问数据库服务器.
这段代码有意义吗? dataAccessConnection是否具有严格的范围?
解决方法
使用没有显式花括号的语句仅适用于以下语句.
using (Idisp1) // use it // it's disposed
因此,当链接时,它们以相同的方式工作.这里使用的第二个用作单个语句.
using (Idisp1) using (Idisp2) { }
Commenter stakx建议格式化以明确编译器如何读取使用块.实际上,这些通常会被视为OP遇到的格式:
using (Idisp1) using (Idisp2) { }
这相当于:
using (Idisp1) { using (Idisp2) { } }
请注意,顶部的第一个始终是最后一个处置.因此,在前面的所有示例中,在Idisp1.Dispose()之前调用Idisp2.Dispose().在许多情况下,你会做这样的事情并不重要,但我相信你应该始终了解你的代码会做什么,并做出明智的决定而不关心.
这方面的一个例子是在阅读网页时:
HttpWebRequest req = ...; using (var resp = req.GetResponse()) using (var stream = resp.GetResponseStream()) using (var reader = new StreamReader(stream)) { TextBox1.Text = reader.ReadToEnd(); // or whatever }
我们得到响应,获取流,获取读者,读取流,处理读取器,处理流,最后,处理响应.
请注意,正如评论者Nikhil Agrawal指出的那样,这是一种关于块的语言功能,并非特定于using关键字.例如,同样适用于if块:
if (condition) // may or may not execute // definitely will execute
与
if (condition1) if (condition2) // will execute if both are true // definitely will execute
当然,你不应该以这种方式使用if语句,因为它读起来很可怕,但我认为这有助于你理解用例.我个人非常好用链接使用块.