有什么理由在C#中写"private"关键字吗?

Cam*_*tin 106 c# specifications private access-modifiers auto-generate

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

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

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

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}
Run Code Online (Sandbox Code Playgroud)

但是,如果暗示和默认,为什么它甚至写私人?只是为了让新手开发人员(不知道它是C#默认值)知道它是私有的吗?或者编译器有区别吗?

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

Ree*_*sey 166

AFAIK,private是C#中的默认值(意思是如果我不写public,protected,internal等,默认情况下它将是私有的).(如果错误,请纠正我).

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

也,

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

明确指定这有助于表示您打算将类型设为私有,非常明确.这有助于提高代码的可维护性.这可以帮助其他开发人员(或您自己)知道某个成员是默认的还是故意的,等等.

  • 这是一个毫无意义的区别.默认情况下,命名空间中的类型是内部的,因为它们*默认情况下不能是私有的; 否则没有人可以使用它们.默认情况下,它们仍然受到限制. (2认同)

Jon*_*eet 117

AFAIK,private是C#中的默认值

不完全 - 默认是"此声明可用的最受限制的访问权限".例如,对于顶级类型,默认值为internal; 对于嵌套类型,默认值为private.

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

它使它显而易见,这有两个原因:

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

至于你的最后一部分:

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

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

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

// Public getter, private setter
public int Bar { get; private set; }
Run Code Online (Sandbox Code Playgroud)

曾经在任何地方都使用默认设置,但我已经确信(部分由Eric Lippert)明确表示你已经考虑过并决定私有化是一个好主意.

我个人希望有这样做的密封/启封,也为类型声明的方式-可能甚至一个默认值.我怀疑很多开发人员(如果我不小心的话,我自己也包括在内)只是因为没有密封的课程,因为它比没有密封.

  • 我当然希望没有默认值,如果缺少访问修饰符,编译器只会抛出一个错误.我不认为大多数人都知道每种情况的默认值是什么,然后会导致意外错误. (19认同)
  • @Phong,对于C#,有一个简单的规则:*默认情况下,所有内容都是私有的.*名称空间中的项目(如非嵌套类)不能是私有的,因为没有任何东西可以使用它们.他们只能是内部或公共的; 所以默认情况下,它们是内部的.其他内容(类中的枚举;嵌套类;属性;字段;方法...)内部的内容默认是私有的. (5认同)

Rya*_*ndy 11

private增加了视觉上的混乱.对于那些坚持让事情变得明确的人,我会问:你是否也用数学做过这个?例如:

var answer = a + b / c;
Run Code Online (Sandbox Code Playgroud)

如果没有多余的括号,你会发现不清楚b / c吗?

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

  • 令我很奇怪的是,有这么多人赞成`var`,因为它减少了视觉上的混乱,但是很多人都赞成无意义地输入`private`. (6认同)
  • 在提问之前我曾经同意这一点。但是,有些人写 VB,有些人写 C++,有些人甚至写 F#(也许来自其他函数式语言,如 Haskell?),比他们写 C# 更好。因此,对于他们(以及我们,如果我们在两年没有使用 c# 后忘记了它)来说,访问器是显式的会更好。不要低估轻松学习对项目的影响,许多开发人员的背景可能无法反映所选择的工具,他们确实需要学习辅助工具,即使在生产代码中,这也不错(我们知道很多C# 代码非常糟糕,因此一些辅助工具也可以帮助我们)。 (3认同)
  • 嗯,当然,在VB中默认是非常的.例如,我认为默认的可见性是成员的"朋友".C#以正确的方式确定其可见性:除非更改,否则将事物设置为最低可见性.从我能够找到的内容来看,C++(结构除外)似乎也是如此.(对于F#来说似乎不是这样.) (3认同)
  • 我甚至会认为视觉混乱*会抑制*可读性! (2认同)
  • 尽管我*确实*更喜欢在数学示例中使用括号,但还是赞成。 (2认同)

JD *_*cks 7

据我所知,私有是C#中的默认值

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

有没有"我认为这是","我敢肯定它是"等它只是为.每个人都在同一页上.

我不是C#开发人员.如果我不得不使用一些未明确声明为私有的代码,我可能会认为它是内部的.

当隐含地设置事物时我不喜欢.它永远不会像明确设置时那样清晰.


Jam*_*mes 6

可读性 - 并非所有人都知道私有是默认行为.

意图 - 清楚地表明您已将该属性专门声明为私有(无论出于何种原因).


Mae*_*ess 5

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


dav*_*nal 5

很多人(像我这样的人!)经常使用几种不同的语言进行编程。明确地处理这些事情可以让我不需要记住我编程所用的所有语言的所有神秘细节。

  • 好吧,我不会说“默认访问修饰符是`private`”是一个*神秘的细节*......但我理解这一点。有一天,我很难记住上周使用的框架([MEF](http://en.wikipedia.org/wiki/Managed_Extensibility_Framework))是如何工作的。 (2认同)