有什么理由在C#中编写“ private”关键字?


109

据我所知,private是默认无处不在C#中(也就是说,如果我不写publicprotectedinternal等这将是private默认情况下)。(如果我错了,请纠正我。)

那么,写该关键字的原因是什么,或者为什么它甚至对于成员来说仍然存在?

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

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

但是,如果隐含和默认了,为什么还要写私有呢?只是这样,新手开发人员(谁不知道这是C#默认值)便知道它是私有的?还是编译器有区别?

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


18
在IIRC中,internal默认情况下将是“顶级”类型。
杰夫·梅卡多

4
如所示,所有内容的默认值都不是私有的,并且根据一般经验,最好是明确的。
詹姆斯·迈克尔·黑尔


一切的默认设置是“尽可能私密”。显然,非嵌套类不能为私有类,否则任何实例都不能实例化或使用它。但是成员默认情况下是私有的,嵌套类默认情况下是私有的。默认情况下,C#中的所有内容都具有最严格的可见性级别。
Ryan Lundy 2012年

Answers:


171

AFAIK,私有是C#中默认的私有语言(这意味着如果我不写public,protected,internal等,则默认情况下它将是私有的)。(如果有错,请纠正我)。

这不是真的。默认情况下,在名称空间内定义的类型(类,结构,接口等)将是内部的。同样,不同类型内的成员具有不同的默认可访问性(例如,接口成员的公共权限)。有关详细信息,请参阅MSDN上的辅助功能级别

也,

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

明确指定此项有助于非常明确地表明您打算将类型设为私有。随着时间的推移,这有助于代码的可维护性。这可以帮助其他开发人员(或您自己)知道成员是默认情况下还是有意使用的私有成员,等等。


1
@Wayne:他得到的答案比Jon Skeet高,但他不值得……Jon的答案更准确。
aleroot

2
这是毫无意义的区别。命名空间中的类型默认情况下是内部的,因为默认情况下它们不能为私有。否则,任何人都无法使用它们。默认情况下,它们仍然受到尽可能多的限制。
瑞安·伦迪

1
inisde类和struct的默认成员可访问性是私有的。在这里检查:msdn.microsoft.com/en-us/library/ba0a1yw2
v=vs.90).aspx

但是名称空间中的元素不能为private
Shimmy Weitzhandler,

此外,getset默认属性本身的可访问性
AustinWBryan

119

AFAIK,私有是C#中所有地方的默认设置

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

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

它使它很明确,这有两个原因:

  • 根据您的问题,它对于那些不知道默认值的人来说更加清楚(我个人从没有喜欢过此参数,但我认为值得一提)
  • 它给人的印象是您已故意将其设为私有,而不是仅仅使用默认值。

至于最后一部分:

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

是的,因为要使一个财产的一半比另一个财产更具限制性:

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

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

曾经尽可能地使用默认设置,但是我一直确信(部分由Eric Lippert负责)明确表明您已经考虑过并决定将某些内容设为私有是个好主意。

我个人希望有这样做的密封/启封,也为类型声明的方式-甚至可能不会一个默认的。我怀疑许多开发人员(如果我不小心的话,也包括我自己)将类未密封,只是因为这样做比将其密封更省力。


+1。尽管我的Java背景使用了final一个更典型的示例,但使用不相关的关键字来表示语义意图很有用。
jprete 2011年

1
@minitech:反过来也可以,但是用处不大。这是所有用C#推出2
乔恩斯基特

20
我当然希望根本没有默认值,并且如果缺少访问修饰符,则编译器会抛出错误。我认为大多数人都不知道每种情况下的默认值,这会导致意外的错误。

+1“对于嵌套类型,默认值为私有”-当我阅读您的答案时,我才知道这一点。谢谢!
诺丁

5
@Phong,对于C#,有一个简单的规则:默认情况下,所有内容都尽可能私有。 诸如非嵌套类之类的命名空间中的项目不能是私有的,因为没有人可以使用它们。它们只能是内部的或公共的。因此默认情况下,它们是内部的。默认情况下,其他事物内部的事物(类中的枚举;嵌套类;属性;字段;方法...)是私有的。
瑞安·伦迪

11

private增加视觉混乱。对于那些坚持要让事情变得明确的人,我会问:您是否也使用数学来做到这一点?例如:

var answer = a + b / c;

您是否发现周围并没有多余的括号而不清楚b / c

C#中的规则非常简单:默认情况下,所有内容都尽可能接近私有。 因此,如果您需要使某些内容比默认内容更具可见性,请添加修饰符。否则,请勿在代码中添加不必要的关键字。


1
在问问题之前,我曾经同意这项权利。但是,有些人写的VB,某些C ++甚至是F#(也许来自其他功能语言,例如Haskell?)要比在C#上做得更好。因此,对于他们(对我们来说,如果在两年没有进行C#处理后就忘记了它),最好是显式的访问器。不要低估易学对项目的影响,许多开发人员来自可能无法反映选择工具的背景,他们确实需要学习辅助,即使在生产代码中,这也不错(我们知道很多代码非常糟糕的C#,因此一些帮助也对我们有帮助)。
卡米洛·马丁

3
好吧,可以肯定的是,在VB中,默认设置是可怕的。我认为默认可见性是Friend针对成员的。C#以正确的方式默认设置其可见性:除非更改,否则将事物设置为尽可能不可见。从我能找到的内容来看,对于C ++(结构除外)而言,情况确实如此。(这似乎并不为F#是真的。)
瑞恩·伦迪

6
对我如此奇怪的是,有这么多人赞成var,因为它减少了视觉混乱,但是却有很多人赞成毫无意义的打字private
Ryan Lundy 2012年

2
我什至会争辩说视觉混乱会阻碍可读性!
2015年

1
即使我upvoted 喜欢在你的数学例子的情况下使用括号。
Marc.2377 '18 / 12/19

7

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

显式声明private,表示您知道它是私有的。不仅如此,因为据您所知,它是默认值。这也意味着其他查看代码的人知道它是什么。

有没有“我认为这是”,“我敢肯定它是”等它只是为。每个人都在同一页面上。

我不是C#开发人员。如果我必须处理一些未明确声明为私有的代码,我可能会认为它是内部的

我不喜欢隐式设置事物。从未明确设置它们的时间。


听起来很合理,我什至忘记了曾经熟悉的语言基础。
卡米洛·马丁

6

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

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


5

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


同意 例如,如果您正在与其他开发人员一起工作,请编写一些代码,将其设置为private有助于表明您的意图。多年后您跳回代码,并且IDE可以告诉您该类应公开访问哪些方法,这也很有用。
亚伦·牛顿

3

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

另一个很好的原因是因为FxCop会告诉您执行此操作。


+1,我刚刚注意到FxCop抱怨我现在用更改构建时删除了private修饰符。
卡米洛·马丁

2

很多人(像我这样的人!)经常使用几种不同的语言进行编程。对此类事情保持露骨,使我无需记住自己编程的所有语言的所有神秘细节。


1
好吧,我不会说“默认访问修饰符是private”是一个神秘的细节 ……但是我理解这一点。前几天,我很难记得上周使用的框架(MEF)的工作方式。
卡米洛·马丁

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.