为可变范围目的使用大括号是错误的吗?

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

 Collection existingCategories = new Collection(); // 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 existingCategories = new Collection(); { // Code here } // can be understood as (is it easy to notice that semicolon is missing?): Collection existingCategories = new Collection() { // Code here } 

所以,

  1. 使用大括号创建代码块只是出于可变范围目的,是否有问题

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

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

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

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

封锁代码本身并没有什么不妥,但你需要考虑为什么要这样做。

如果您正在复制和粘贴代码,那么您可能会遇到重构代码并生成重复调用的函数而不是重复执行类似但不同的代码块的情况。

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

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

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

我认为这些块是好主意,我经常使用它们。 当您需要分离太小而无法提取到方法中的代码块,或者当方法由几个代码块看起来彼此相似但不具有相同逻辑时,它非常有用。 它允许在没有命名冲突的情况下为变量赋予相同的名称,这使得方法体更具可读性。

顺便说一句,我认为StyleCop有默认规则集,有更多的规则,权宜之计是值得商榷的。

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

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

如果您需要使用大括号来限制变量的范围,那么您的方法可能已经太长了。 只是想强调其他人已写的内容。