如果没有花括号,using语句的范围是什么

时间:2014-07-18 07:34:09

标签: c# ado.net using-statement

我继承了以下代码:

    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是否具有严格的范围?

3 个答案:

答案 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 }

  

基本上,花括号总是可以用来接受单个语句被接受的情况,而不是多个语句。

恰好,我们确实想要使用多个语句,所以大括号往往被视为ifusing等的一部分。声明。然而,事实上,它们是语言的一部分。