【问题标题】:Any reason to write the "private" keyword in C#?有什么理由在 C# 中编写“private”关键字?
【发布时间】:2012-01-18 17:39:59
【问题描述】:

据我所知,private 是 C# 中默认的everywhere(这意味着如果我不写publicprotectedinternal 等,它将默认为private)。 (如果我错了,请纠正我。)

那么,编写该关键字的原因是什么,或者为什么它甚至存在于成员中?

例如,当自动生成事件处理程序时,它看起来像这样:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

但是,如果这是隐含的和默认的,为什么它甚至会写私有呢?只是为了让新手开发人员(他们不知道这是 C# 的默认设置)知道它是私有的吗?还是编译器有区别?

此外,是否存在写“私人”(单独)改变成员的可访问性的情况?

【问题讨论】:

标签: c# private specifications access-modifiers auto-generate


【解决方案1】:

AFAIK,private 是 C# 中的默认设置(这意味着如果我不编写 public、protected、internal 等,默认情况下它将是私有的)。 (如有错误请指正)。

这不是真的。默认情况下,命名空间中定义的类型(类、结构、接口等)将是 internal。此外,不同类型的成员具有不同的默认可访问性(例如接口成员的公共)。有关详细信息,请参阅 MSDN 上的Accessibility Levels

还有,

那么,写那个关键字的原因是什么,或者它为什么存在?

明确指定此有助于表示您非常明确地将类型设为私有的意图。随着时间的推移,这有助于您的代码的可维护性。这可以帮助其他开发人员(或您自己)了解成员是默认私有还是故意私有等。

【讨论】:

  • @Wayne :他的答案比 Jon Skeet 得分高,但他不配得到它...... Jon 的答案要准确得多。
  • 这是毫无意义的区别。命名空间中的类型默认是内部的,因为默认情况下它们不能是私有的;否则什么都不能使用它们。默认情况下,它们仍然受到尽可能多的限制。
  • inisde 类和结构的默认成员可访问性是私有的。在这里查看:msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
  • 但是命名空间内的元素不能是private
  • 另外,getset 默认为属性本身的可访问性
【解决方案2】:

AFAIK,private 是 C# 中所有地方的默认值

不完全-默认是“此声明可用的最受限制的访问”。例如,对于*类型,默认值为internal;对于嵌套类型,默认值为 private

那么,写那个关键字的原因是什么,或者它为什么存在?

它让它变得明确,这有两个好处:

  • 根据您的问题,对于那些不知道默认值的人来说,它更清楚(我个人从不喜欢这个论点,但我认为值得一提)
  • 它给人的印象是您故意决定将其设为私有,而不是仅仅采用默认设置。

至于你的最后一部分:

此外,是否存在写“私人”(单独)会改变成员的可访问性的情况?

是的,为了让一个属性的一半比另一个更严格:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

使用尽可能地使用默认值,但我已经确信(部分是由 Eric Lippert 说服的)明确表明您已经考虑过并决定 em> 将某些东西设为私有是个好主意。

就我个人而言,我希望对于密封/非密封也有一种方法,对于类型声明 - 甚至可能没有 默认值。我怀疑许多开发人员(包括我自己在内,如果我不小心的话)只是因为这比让它们密封更省力而让类不密封。

【讨论】:

  • +1。使用其他不相关的关键字来表示语义意图很有用,尽管我的 Java 背景使final 的使用成为一个更典型的例子。
  • @minitech:反过来也可以,但用处不大。这都是在 C# 2 中引入的。
  • 我当然希望根本没有默认值,如果缺少访问修饰符,编译器只会抛出错误。我认为大多数人并不知道每种情况的默认值是什么,这会导致意外错误。
  • +1 “对于嵌套类型,默认值为私有” - 当我阅读您的答案时,我才知道这一点。谢谢!
  • @Phong,对于 C#,有一个简单的规则:默认情况下,一切都是私有的。 命名空间中的项目(例如非嵌套类)不能是私有的,因为没有任何东西可以使用它们。它们只能是内部的或公开的;所以默认情况下,它们是内部的。默认情况下,其他事物内部的事物(类中的枚举;嵌套类;属性;字段;方法...)是私有的。
【解决方案3】:

private 增加视觉混乱。对于那些坚持它使事情变得明确的人,我会问:你也用数学来做这件事吗?例如:

var answer = a + b / c;

如果b / c 周围没有多余的括号,您是否觉得不清楚?

C# 中的规则非常简单:默认情况下,一切都尽可能接近私有。因此,如果您需要比默认,添加修饰符。否则,不要在代码中添加不必要的关键字。

【讨论】:

  • 我曾经在问这个问题之前同意这个权利。但是,有些人写 VB,一些 C++,甚至 F#(可能来自其他函数式语言,比如 Haskell?),比他们用 C# 写的更好。所以,对于他们(如果我们在 2 年没有 c#ing 之后我们忘记它)来说,最好是显式访问器。不要低估轻松学习对项目的影响,许多开发人员的背景可能无法反映所选择的工具,他们确实需要学习辅助工具,即使在生产代码中,这一点也不差(我们知道很多代码非常糟糕的 C#,所以一些帮助也可以帮助我们)。
  • 嗯,当然,在 VB 中,默认设置是残酷的。例如,我认为成员的默认可见性是Friend。 C# 以正确的方式默认其可见性:除非更改,否则将事物设置为尽可能低的可见性。据我所知,C++ 似乎也是如此(结构除外)。 (对于 F# 来说似乎不是这样。)
  • 我很奇怪,有这么多人支持var,因为它减少了视觉混乱,但还有这么多人支持毫无意义地输入private
  • 我什至会争辩说视觉混乱抑制可读性!
  • 赞成,尽管我确实更喜欢在您的数学示例中使用括号。
【解决方案4】:

据我所知,private 是 C# 中所有地方的默认设置

明确声明私有,意味着你知道它是私有的。不只是认为它是,因为据您所知,它是默认值。这也意味着查看代码的其他人知道它是什么。

没有“我认为是”、“我很确定是”等。只是。每个人都在同一个页面上。

我不是 C# 开发人员。如果我必须使用一些没有明确声明private的代码,我可能会认为它是internal

我不喜欢隐式设置。从来没有像明确设置它们那样清晰。

【讨论】:

  • 听起来很有道理,我什至忘记了我曾经更了解的语言基础知识。
【解决方案5】:

可读性 - 不是每个人都知道私有是默认行为。

Intent - 明确表明您已明确将属性声明为私有(无论出于何种原因)。

【讨论】:

    【解决方案6】:

    可读性、意图展示是我能想到的两个重要原因。

    【讨论】:

    • 同意。例如。如果您正在与其他开发人员一起编写一些代码,则将某些内容设置为私有有助于表明您的意图。当您在多年后重新回到您的代码中时,它也很有帮助,您的 IDE 可以告诉您哪些方法应该对该类公开访问。
    【解决方案7】:

    明确指定可见性的一个很好的理由是,您不必考虑您所处的上下文的默认值是什么。

    另一个很好的理由是因为FxCop 告诉你这样做。

    【讨论】:

    • +1,我刚刚注意到 FxCop 抱怨我现在使用更改构建时删除了私有修饰符。
    【解决方案8】:

    很多人(像我这样的人!)经常使用几种不同的语言进行编程。像这样明确表达使我不需要记住我编程的所有语言的所有神秘细节。

    【讨论】:

    • 好吧,我不会说“默认访问修饰符是private”是一个神秘的细节...但我明白这一点。前几天,我记不起上周使用的框架 (MEF) 是如何工作的。
    【解决方案9】:

    我会说是为了与课程其余部分范围的可读性保持一致。

    【讨论】:

    【解决方案10】:

    我喜欢明确添加 private 关键字,以便我知道它是私有的。另外,private 并不总是无处不在的默认访问说明符。此外,您可以在属性中使用private set 来有效地创建只能由声明它的类设置的只读属性。

    【讨论】: