有时,我使用牙套隔离一个代码块,以避免以后错误地使用变量。例如,当我放几个 SqlCommands在相同的方法中,我经常复制代码块,结束时,请混合名称并执行两次命令。增加牙套有助于避免这种情况,因为使用了错误 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规则的情况下使其更具可读性?

有帮助吗?

解决方案

我认为纯粹使用括号纯粹用于界定范围没有任何问题 - 有时可能非常有用。

例子 - 我遇到了一个使用的库 Profile 代码时间部分的对象。这些是通过衡量从创造到破坏的时间来奏效的,因此,通过在堆栈上创建并在离开范围时被摧毁,从而衡量了该特定范围所花费的时间。如果您想安排任何天生没有自己范围的东西,那么添加额外的牙套来定义该范围可能是最好的方法。

至于可读性,我可以理解为什么Stylecop不喜欢它,但是任何具有C/C ++/Java/C#/...的人都知道一对撑杆对定义了一个范围,应该很明显您正在尝试做。

其他提示

没错 本身 通过阻止代码,但是您需要考虑为什么要这样做。

如果您要复制和粘贴代码,那么您可能应处于重构代码并产生您反复调用的函数,而不是反复执行相似但不同的代码块。

使用 using 声明而不是裸露的支撑块。

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

从较大的角度来看,您应该考虑将此方法分为较小的方法。使用一个 SqlCommand 接下来是另一个方法,最好是通过调用一种方法,然后是另一种方法。然后,每种方法将使用自己的本地 SqlCommand.

我认为这样的障碍是个好主意,我经常使用它们。当您需要分开太小而无法提取到方法中的代码块或方法由几个代码块组成时,这很有用 好像 彼此,但没有相同的逻辑。它允许在不命名冲突的情况下给变量相同的名称,这使方法身体更具可读性。

顺便说一句,我的意见Stylecop具有默认规则设置的更多规则,而权宜之计是有争议的。

我不得不说,如果您使用范围,我是否要处理此代码。它不是Afaik,是普通实践。

我认为这是您要这样做的气味。我认为更好的做法是将每个范围分解为自己的方法,并具有完全描述性的名称和文档。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top