10

我真的很欣赏在代码中定义区域的可能性,因为它极大地提高了可读性。

无论如何,我想让每个人在所有类中使用相同的约定(所有区域的预定义顺序),例如:

  • 私有字段
  • 构造函数
  • 类属性
  • 事件处理程序
  • ETC...

您有什么建议吗?这种划分会是什么样子(哪些区域有意义,它们应该有什么名称)以及它们应该以什么顺序定义?

4

10 回答 10

36

我的约定是不使用它们。

如果您发现您的班级太大以至于您需要通过区域隐藏大部分班级,我建议您的班级太复杂并且应该分开。

于 2010-04-06T08:14:52.703 回答
12

有人曾经说过,有一个像上面这样的约定:

  • 私有字段
  • 构造函数
  • 类属性
  • 事件处理程序
  • ETC...

就像摆一张桌子,所有的盘子都在一起,所有的勺子都在一起,所有的刀子都在一起,所有的叉子都在一起。

我对这个#region问题的看法是将相关的方法、事件定义和属性放在一个区域中。但是,完全必须这样做会表明代码有异味(您的类太大或做的事情太多),但这是将其重构为更好的类的良好第一步。

于 2010-04-06T08:13:41.277 回答
7

每当我看到区域时,我认为代码要么已生成,要么需要重构。

避免使用它们,当你觉得需要它们时,重新检查你在做什么,并尝试将你的班级分成更小的班级。最终,这将比使用区域更有助于提高应用程序的可读性。

于 2010-04-06T08:20:06.147 回答
6

就我个人而言,我不建议将代码区域作为代码约定的一部分。主要原因是区域隐藏代码,这可能会导致以下问题:

  • 开发人员可能会错过源代码的一些重要部分
  • 同一文件中 LOC 的平均数量趋于增加

如果您有兴趣在您的团队中实施编码风格约定,请查看Microsoft StyleCop。请注意,该工具目前仅适用于 C#。

于 2010-04-06T08:24:05.700 回答
3
#region Lotsa boring code and lookup tables

我用它来节省屏幕空间,仅此而已:)

于 2010-04-06T08:18:08.547 回答
3

我使用以下区域:

Private Member Variables
Constructor
Public Properties
Private Methods
Public Methods
Events

原因是因为更好的代码组织。
我使用的文件可能有超过 2000 行代码,并且很难在没有区域的情况下维护代码。

于 2010-04-06T09:10:11.930 回答
3

我认为地区没有必要。它们不清晰。如果你需要(想想,你真的需要吗?)你的类中的数量代码,你可以使用“部分”类来拆分类逻辑单元。

于 2010-04-06T09:55:02.130 回答
2

将它们视为另一种形式的注释:与您的代码混合的附加信息,没有对其进行正式检查。因此,它可能会随着代码而过时。

因此,切勿在代码中已经说明的注释或区域指令中重复。

仅添加额外信息。

特别是,使用区域来重申某些成员是属性、事件等的事实是完全没有意义的。最常见的问题是您为“私有方法”创建了一个区域,然后您编辑其中一个使其公开。现在你必须移动它,这意味着在与旧版本的差异中,简单的变化更难辨别。

于 2010-04-06T08:16:55.697 回答
1

您可能对此感兴趣,您是否对 c# region 说不

我认为只要您在整个项目中保持一致,您编写它们的顺序并不重要。还要非常小心过度使用它们(因此是初始链接!)。

没有什么比找到一个只隐藏一行代码的封闭构造器区域更糟糕的了。

我认为这最终取决于个人口味。正如我所说,一致性是关键!

于 2010-04-06T08:15:34.467 回答
1

我为我一直使用的 VS 2008 编写了自己的区域代码片段:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
    <Header>
        <Title>#class region</Title>
        <Shortcut>#classregion</Shortcut>
        <Description>Code snippet for #region in classes</Description>
        <Author>Simon Linder</Author>
        <SnippetTypes>
            <SnippetType>Expansion</SnippetType>
            <SnippetType>SurroundsWith</SnippetType>
        </SnippetTypes>
    </Header>
    <Snippet>
        <Declarations>
            <Literal>
                <ID>name</ID>
                <ToolTip>Region name</ToolTip>
                <Default>MyRegion</Default>
            </Literal>
        </Declarations>
        <Code Language="csharp">
            <![CDATA[#region Variables
                    $selected$ $end$
                #endregion

            #region Construction/Destruction
                    $selected$ $end$
                #endregion

            #region Properties
                    $selected$ $end$
                #endregion

            #region Public Methods 
                    $selected$ $end$
                #endregion

            #region Private/Proteced Methods
                    $selected$ $end$
                #endregion]]>
        </Code>
    </Snippet>
</CodeSnippet>

如您所见,我确实将区域用于、VariablesConstruction/DestructionProperties方法。我经常将另一个子区域添加到名为. 区域的顺序也适用于StyleCopPublicPrivateevents

于 2010-04-06T08:20:12.053 回答