时间:2010-07-06 19:01:33

标签: c# coding-style scope stylecop object-lifetime

我有时会使用大括号来隔离代码块,以避免以后错误地使用变量。例如,当我在同一个方法中放置几个​​SqlCommand时,我经常复制粘贴代码块,最后混合名称并执行两次命令。添加大括号有助于避免这种情况,因为在错误的位置使用错误的SqlCommand将导致错误。这是一个例子:

Collection<string> existingCategories = new Collection<string>();

// Here a beginning of a block
{
    SqlCommand getCategories = new SqlCommand("select Title from Movie.Category where SourceId = @sourceId", sqlConnection, sqlTransaction);
    getCategories.Parameters.AddWithValue("@sourceId", sourceId);
    using (SqlDataReader categoriesReader = getCategories.ExecuteReader(System.Data.CommandBehavior.SingleResult))
    {
        while (categoriesReader.Read())
        {
            existingCategories.Add(categoriesReader["Title"].ToString());
        }
    }
}

if (!existingCategories.Contains(newCategory))
{
    SqlCommand addCategory = new SqlCommand("insert into Movie.Category (SourceId, Title) values (@sourceId, @title)", sqlConnection, sqlTransaction);

    // Now try to make a mistake and write/copy-paste getCategories instead of addCategory. It will not compile.
    addCategory.Parameters.AddWithValue("@sourceId", sourceId);
    addCategory.Parameters.AddWithValue("@title", newCategory);
    addCategory.ExecuteNonQuery();
}

现在,每当一个块跟随空行时,StyleCop都会显示警告。另一方面,不放空行会使代码更难理解。

// Something like:
Collection<string> existingCategories = new Collection<string>();
{
    // Code here
}

// can be understood as (is it easy to notice that semicolon is missing?):
Collection<string> existingCategories = new Collection<string>()
{
    // Code here
}

所以,

  1. 在使用大括号创建代码块时是否存在错误仅用于可变范围目的?

  2. 如果没问题,如何在不违反StyleCop规则的情况下使其更具可读性?

5 个答案:

答案 0 :(得分:20)

本身没有任何错误阻止代码,但你需要考虑为什么要这样做。

如果您正在复制和粘贴代码,则可能会出现这样的情况:您应该重构代码并生成重复调用的函数,而不是重复执行类似但不同的代码块。

答案 1 :(得分:12)

使用using语句而不是裸括号块。

这将避免警告,并使您的代码在资源方面更有效。

从更大的角度来看,您应该考虑将此方法拆分为更小的方法。通过调用一个方法后跟另一个方法,通常可以更好地使用一个SqlCommand后跟另一个方法。然后,每种方法都会使用自己的本地SqlCommand

答案 2 :(得分:6)

我认为使用大括号纯粹是为了划分范围没有任何问题 - 它有时非常有用。

一个例子 - 我曾经遇到过一个使用Profile个对象计算代码段的分析库。这些通过测量从创建到销毁的时间来工作,因此通过在堆栈上创建然后在它们超出范围时被销毁而最佳地工作,从而测量在该特定范围中花费的时间。如果你想要计算一些本身没有自己范围的东西,那么添加额外的大括号来定义这个范围可能是最好的方法。

至于可读性,我可以理解为什么StyleCop不喜欢它,但任何有C / C ++ / Java / C#/ ...经验的人都知道大括号对定义了一个范围,它应该是相当明显的这就是你要做的事。

答案 3 :(得分:4)

答案 4 :(得分:3)

我不得不说,如果我通过使用示波器稍微减少了我的工作代码。它不是,非常常见的做法。

我认为这是你要做的气味。我认为更好的做法是使用完全描述性的名称和文档将每个范围分解为自己的方法。