我继承了以下代码:
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是否具有严格的范围?
答案 0 :(得分:12)
using
语句仅适用于以下语句。
using (Idisp1)
// use it
// it's disposed
因此,当链接时,它们以相同的方式工作。第二个using
在此处作为单个陈述。
using (Idisp1)
using (Idisp2)
{
}
评论者stakx建议格式化以明确编译器如何读取使用块。实际上,这些通常会被视为OP遇到的格式:
using (Idisp1)
using (Idisp2)
{
}
这相当于:
using (Idisp1)
{
using (Idisp2)
{
}
}
请注意,顶部的第一个始终是最后一个处置。因此,在之前的所有示例中,Idisp2.Dispose()
之前都会调用Idisp1.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
语句,因为阅读起来很可怕,但我认为这有助于你理解using
案例。我个人非常好,链接using
块。
答案 1 :(得分:10)
从C#8.0开始,const b = a.map(item => {
return item.reduce((arr,curr) => {
return {
...arr,
['age']: curr['age'],
[curr['role']]: curr['count'],
}
}, {})
})
console.log(b)
关键字可用作一次性对象(Reference)的变量声明中的属性。语义是您所期望的-对象自动在范围的末尾布置。
using
输出
Using 1 No Using 2 Using 3 No Using 4 Using 3 disposed Using 1 disposed
答案 2 :(得分:0)
C#语言规范(Version 5)将using
语句描述为:
使用语句:
using (
资源获取)
嵌入式声明
那是:
using
语句获取一个或多个资源,执行语句,然后处置该资源。
(我的重点)
那么,我们如何最终使用花括号呢?因为 embedded-statement 的定义是:
嵌入语句:
块
空语句
表达式语句
选择语句
迭代语句
跳转语句的
尝试语句的
签声明
选中语句的
锁定声明
使用语句
产量声明
和
嵌入式语句非终结符用于出现在其他语句中的语句
最后,我们发现块定义为:
块允许在允许单个语句的上下文中写入多个语句。
块:
{
statement-list opt}
基本上,花括号总是可以用来接受单个语句被接受的情况,而不是多个语句。
恰好,我们确实想要使用多个语句,所以大括号往往被视为if
,using
等的一部分。声明。然而,事实上,它们是语言的一部分。