c# – 如果没有花括号,using语句有什么范围
我继承了以下代码:
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语句,因为它读起来很可怕,但我认为这有助于你理解用例.我个人非常好用链接使用块. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |