【问题标题】:What for should I mark private variables as private if they already are?如果它们已经是私有变量,我应该将它们标记为私有变量吗?
【发布时间】:2009-02-16 10:24:28
【问题描述】:

据我所知,在 C# 中,所有字段默认都是私有的,除非另有标记。

class Foo
{
  private string bar;
}

class Foo
{
  string bar;
}

我猜这两个声明是相等的。

所以我的问题是:如果私有变量已经是私有的,我应该将它们标记为private 做什么?

【问题讨论】:

  • 嗯,你不应该。语法是隐含的,我看不出你为什么要写它,因为它是多余的。我更喜欢简短的语法,而且我不会仅仅因为可以这样做而将字符浪费在无意义的糖上。完全由你决定你想做什么,这根本没有区别

标签: c# .net default declaration


【解决方案1】:

现在;无论如何,字段几乎总是应该是私有的,所以你是否应该打扰是一个边缘情况。

对于更广泛的主题,我记得 Eric Lippert 的评论 - 基本上是说给定方法/类/任何东西:

void Foo() {}
class Bar {}

然后不清楚它们是否是故意的私有/内部,或者开发人员是否考虑过,并决定它们应该是私有/内部/什么的。所以他的建议是:告诉读者你做事是故意的,而不是偶然的——说清楚。

【讨论】:

  • Jon 挖出了有问题的评论:csharpindepth.com/ViewNote.aspx?NoteID=54
  • 开发者不应该“故意决定”是否是私有的。它应该是自动私有的,因此是默认值。只有公共和受保护的成员需要有意识地做出决定。
  • @Constantin - 如果你经过这个思考过程,并确定private 实际上是正确的,那又会怎样。告诉读者!对于类,还有另一个很好的理由(部分类歧义)。
  • @Constantin - 强烈反对。默认值对于可读性来说很糟糕。如果 void 成为方法的默认输出,你会乐意让它隐含吗?如果是字符串[]呢?
  • @annakata - 确实;另一个:类的默认可访问性是什么?很多人说“内部”,但这是不正确的;它是顶层的“内部”,嵌套的“私有”。另一个显式会带来好处的案例。
【解决方案2】:

我对这个问题犹豫了一段时间。我曾经主张让它隐含,但现在我认为我倾向于让它变得明确。

隐含的原因:

  • 这意味着对于非私人成员(或任何比默认访问权限更多的成员)存在更大的差异;这突出了阅读代码时的区别

明确说明的原因:

  • 一些开发人员可能不知道默认值:明确表示每个人都清楚
  • 这表明您已经主动做出了决定,而不是仅仅将其保留为默认值

当我们刚才讨论时,后面的这些点是basically the ones made by Eric Lippert

【讨论】:

  • 对我来说,明确“私有”的第二个论点有点像“我正在写 'i = +42' 而不是 'i = 42' 以向维护程序员表明我知道负数!我在这里积极做决定!” :)
  • @Constantin:类比证明不是证明,正如您在其他地方所说的那样。我想说的是,如果您的编码标准要求您指定访问权限,您更有可能考虑它,这意味着您更有可能做出正确的决定。
【解决方案3】:

是的,它们是相等的,但我喜欢将私有变量标记为 private,我认为它可以提高阅读能力。

我也对私人成员使用这种通用符号,它非常有用:

private string _bar;

【讨论】:

  • 很抱歉投了反对票,但我真的不喜欢下划线。
  • 我认为这不值得一票否决(已修复) - 命名约定是一个分裂问题,基于它的反对票是不合理的。
  • @Jakub - 坦率地说,那又怎样?这与实际问题无关,事实是很多人确实发现 _ 前缀很有帮助。碰巧的是,我更喜欢没有它,但对此的反对只是微不足道的。
  • 私有/成员变量的下划线是很常见的命名约定
  • 过去 6 年我已经习惯了这个约定,所以我再给一个 1。
【解决方案4】:

这纯粹是一个编码标准问题,但为了它的价值,我总是明确地将私有成员标记为私有。

【讨论】:

    【解决方案5】:

    如果您定期在 Java 和 C# 之间切换,我想明确指定访问修饰符将是相当重要的。例如在 Java 中

    void myMethod()
    {
    
    }
    

    包中的任何类都可以访问该方法。在 C# 中,它显然是类和内部类私有的。

    【讨论】:

      【解决方案6】:

      不要让人们猜测,不要让他们做出错误的假设,也不要认为更少的字符以任何方式等同于清晰。

      没有充分的理由明确说明这一点,恕我直言,C# 支持它是一个错误(特别是如果他们愿意做他们所做的事情来切换语句)

      【讨论】:

        【解决方案7】:

        在某些边缘情况下显式使用私有可以提高可读性。

        例子:

                /*
                Tomorrow when we wake up from bed,
                first me and Daddy and Mommy, you, eat
                breakfast eat breakfast like we usually do,
                and then we're going to play and
                then soon as Daddy comes, Carl's going
                to come over, and then we're going to
                play a little while. And then Carl and
                Emily are both going down to the car
                with somebody, and we're going to ride
                to nursery school [whispered], and then
                when we get there, we're all going
                to get out of the car...
                */
        
                int spam;
        
                /*
                Does this style look at all familiar?
                It should!
                */
        

        查看此片段,您可能不确定您是在方法范围内还是在类范围内。

        在字段名称中使用private 或下划线(private int spam;int spam_;int _spam;)将消除混淆。

        【讨论】:

          【解决方案8】:

          由你决定。做最好的可读性或对您的情况有意义的事情。我将它们标记为私有只是为了说明清楚。

          【讨论】:

            【解决方案9】:

            我认为为了可读性,最好是明确的。

            另一方面,您可能希望查看一个名为 Code Style Enforcer (http://joel.fjorden.se/static.php?page=CodeStyleEnforcer) 的 Visual Studio 插件,它使用 dxCore 扩展来提供实时反馈代码遵守编码标准(完全可定制)。

            【讨论】:

              【解决方案10】:

              我个人更喜欢显式标记默认私有和默认公共字段。您可能很清楚默认设置,但只要您快速扫描代码,您的大脑就会喜欢冗长。

              【讨论】:

              • 当我快速扫描代码时,我的大脑当然更喜欢简洁,而不是冗长。我不认为记住默认值是个问题,因为这是我能想象到的最合乎逻辑的默认值。
              • 对于类“private”是默认的,对于结构“public”是默认的。如果您使用不同的语言,它只会变得更糟。我更愿意帮助自己。
              • @so-tester,这是一个 C# 问题,而不是 C++。私有仍然是 C# 结构的默认设置。
              猜你喜欢
              • 2014-08-03
              • 1970-01-01
              • 1970-01-01
              • 2013-04-01
              • 2013-01-02
              • 1970-01-01
              • 2015-05-20
              • 2012-06-03
              • 2018-09-01
              相关资源
              最近更新 更多