如果已经是私有变量,为什么还需要将私有变量标记为私有的?

4
据我所知,在C#中,默认情况下所有字段都是私有的,除非另有标注。
class Foo
{
  private string bar;
}

class Foo
{
  string bar;
}

我猜这两个声明是相等的。
所以我的问题是:如果变量已经是私有的,为什么还要标记为private

好的,你不应该这样做。语法是隐含的,我看不出为什么你要写那个,因为它是多余的。我更喜欢简短的语法,我不会浪费字符在无意义的语法上,只是因为可以这样做。你完全可以自行决定你想做什么,这没有任何区别。 - John Leidegren
10个回答

28

现在,字段应该几乎总是私有的,所以是否值得费心去做这件事情完全是一个边缘情况。

对于更广泛的主题,我记得Eric Lippert曾经发表过评论 - 本质上是说,考虑到一个方法/类/任何东西:

void Foo() {}
class Bar {}

那么它们是私有/内部的是否是故意的,或者开发人员想过这个问题,并且决定它们应该是私有的/内部的/其他。因此他的建议是:告诉读者你是故意而不是偶然地做事情-让它明确。


Jon找到了有关的评论:http://csharpindepth.com/ViewNote.aspx?NoteID=54 - Marc Gravell
开发者不应该有意地“决定”某些内容是否是私有的。它应该自动变成私有的,因此是默认的。只有公共和受保护的成员需要有意识地进行决策才能使它们如此。 - Constantin
@Constantin - 强烈不同意。默认值对于可读性来说是很糟糕的。如果void成为方法的默认输出,你会愿意让它隐式存在吗?如果是string[]呢? - annakata
@annakata,@Marc Gravell。类比证明并不是真正的证明。这个问题与字段的默认访问权限有关,而不是类的默认访问权限或默认返回类型。如果从C#中移除字段的默认私有访问权限,将消除哪一类编程错误? - Constantin
@Mike Rosenblum,请在https://dev59.com/zEbRa4cB1Zd3GeqP1pNg#553085中添加一个明确的私有保护代码员免受某些不良影响的情况示例。虽然已经有一个示例,但它比较薄弱。 - Constantin
显示剩余3条评论

15

我对这个问题一直犹豫不决。我曾经主张留下隐式的方式,但现在我认为我更倾向于显式地表明。

留下隐式方式的原因:

  • 这意味着非私有成员(或任何比默认权限更高的东西)之间的差异更大;这在阅读代码时突出了差异

显式表明的原因:

  • 一些开发人员可能不知道默认值:显式表明意味着清晰易懂,对每个人都是如此
  • 它表明你已经积极做出了决定,而不是让它保持默认状态

我们讨论过这些后者的观点,基本上是Eric Lippert提出的观点


2
对我来说,将“private”显式化的第二个参数有点像“我写‘i = +42’而不是‘i = 42’,以向维护程序员表明我知道负数的存在!我在这里积极地做出决策!” :) - Constantin
1
@Constantin:类比证明并不是真正的证明,就像你在其他地方所说的那样。我认为,如果您的编码标准要求您指定访问权限,那么您更有可能考虑它,这意味着您更有可能做出正确的决定。 - Jon Skeet

8

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

另外,我使用这种常见的符号来表示私有成员,它非常有用:

private string _bar;

@Jakub - 坦白地说,那又怎样?那与实际问题无关,事实是许多人确实发现下划线前缀很有帮助。恰好我喜欢没有下划线前缀的代码,但是在这个问题上投反对票只是小气而已。 - Marc Gravell
我已经使用这种约定6年了,所以我会再用一年。 - Chris S
我必须承认,那真的不属于这里 - 这个问题不是关于你的命名约定的(而且我不知道这比匈牙利命名法好在哪里)。 - annakata
我同意Jakub关于使用下划线的观点。我更喜欢在字段中使用驼峰式命名法,而在属性中使用首字母大写的命名法。 - abatishchev
岁月流逝,我已经不记得何时开始在字段前加下划线以区分变量了。 - abatishchev
显示剩余8条评论

4

这只是一个编码标准的问题,但值得一提的是,我总是明确将私有成员标记为私有。


4

如果您经常在Java和C#之间切换,那么明确指定访问修饰符可能非常重要。例如,在Java中:

void myMethod()
{

}

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


3

不要让人猜测,也不要让他们做出错误的假设,不要认为字数更少就等于更清晰明了。

没有任何好理由明确表达这一点,而且在我看来,如果C#因为同样的原因愿意像他们对switch语句所做的那样支持它是一个错误。


2

在某些边缘情况下,明确使用private关键字可以提高可读性。

示例:

        /*
        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;)可以消除混淆。


1

由你决定。做对可读性最好或在你的情况下有意义的事情。我将它们标记为私有,只是为了让它更清晰明了。


1

我认为为了易读性,最好是明确表达。

此外,您可能希望看一下 Visual Studio 插件 Code Style Enforcerhttp://joel.fjorden.se/static.php?page=CodeStyleEnforcer),它使用 dxCore 扩展程序实时提供有关您的代码符合编码标准的反馈(完全可定制)。


0

我个人更喜欢显式地标记默认的私有和默认的公共字段。你可能很清楚这些默认值,但当你快速扫描代码时,你的大脑会喜欢冗长。


当我快速扫描代码时,我的大脑肯定更喜欢简洁而不是冗长。我认为记住默认值不是问题,因为它是我能想象到的最合乎逻辑的默认值。 - Constantin
对于类,“private”是默认的;对于结构体,“public”是默认的。如果您使用不同的编程语言,情况会更糟。我更喜欢自己解决问题。 - User
@so-tester,这是一个C#问题,不是C++。对于C#结构体,私有仍然是默认值。 - Constantin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接