c# – 如果没有花括号,using语句有什么范围

前端之家收集整理的这篇文章主要介绍了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语句,因为它读起来很可怕,但我认为这有助于你理解用例.我个人非常好用链接使用块.

猜你在找的C#相关文章