“私人”修饰符有什么作用?

考虑“私有”是类成员的默认访问修饰符,为什么关键字甚至需要?

它适用于您(以及未来的维护者),而不是编译器。

这里有一定数量的错误信息:

“默认访问修饰符不是私有的,而是内部的”

那么,这取决于你在谈论什么。 对于某类型的成员,它是私有的。 对于顶级类型本身,它是内部的。

“私有只是类型上方法的默认值”

不,它是类型的所有成员的默认值 – 属性,事件,字段,运算符,构造函数,方法,嵌套类型以及我忘记的任何其他内容。

“实际上,如果未使用访问修饰符声明类或结构,则默认为内部”

仅适用于顶级类型。 对于嵌套类型,它是私有的。

除了限制一个部分而不是另一个部分的属性访问之外,默认基本上总是“尽可能限制”。

就个人而言,我对是否明确的问题犹豫不决。 使用默认值的“专业人士”是它突出显示您正在创建比最严格的级别更可见的内容。 明确指定它的“专家”是那些不了解上述规则的人更明显,它表明你已经考虑了一下。

Eric Lippert采用明确的forms,我也开始倾向于这样。

有关详细信息,请参阅http://csharpindepth.com/ViewNote.aspx?NoteID=54 。

明晰。 我从不使用默认值并始终显式添加修饰符。

这可能是因为我的Java背景默认为’package’(大致相当于C#中的’internal’)所以差异总是困扰着我。 我发现显而易见更为可取。

我现在也使用ReSharper,默认是明确的,所以它只能证实并强化我的偏见:)

私有修饰符解释了意图。

私有成员变量不适用于类外的直接操作。 可以为变量创建get / set访问器,也可以不为其创建访问器。

私有方法不适合在课外使用。 这可能仅适用于内部function。 或者您可以将默认构造函数设为私有,以防止在不传入值的情况下构造类。

私有修饰符(以及其他类似的修饰符)可以是编写自我记录代码的有用方法。

正如Jon Skeet在他的书C#In Depth中指出的那样,在C#中有一个地方需要私有关键字来实现效果。

如果我的内存服务正确,那么private关键字是创建私有范围属性getter或setter的唯一方法,当它的对面具有大于私有可访问性时。 例:

public bool CanAccessTheMissileCodes { get { return canAccessTheMissileCodes; } private set { canAccessTheMissileCodes = value; } } 

private关键字是实现此目的所必需的 ,因为附加的属性可访问性修饰符只能缩小范围,而不能扩大范围。 (否则,可能已创建私有(默认情况下)属性,然后添加公共修饰符。)

Private仅是类型上方法的默认值,但private修饰符在其他地方使用。

来自C#语言规范3.0(msdn)第3.5.1节

根据成员声明发生的上下文,仅允许某些类型的声明可访问性。 此外,当成员声明不包含任何访问修饰符时,发生声明的上下文确定默认声明的可访问性。

  • 命名空间隐式具有公共声明的可访问性。 命名空间声明中不允许访问修饰符。
  • 在编译单元或名称空间中声明的类型可以具有公共或内部声明的可访问性,并且默认为内部声明的可访问性。
  • 类成员可以具有五种声明的可访问性中的任何一种,并且默认为私有声明的可访问性。 (请注意,声明为类成员的类型可以具有五种声明的可访问性中的任何一种,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
  • Struct成员可以具有public,internal或private声明的可访问性,并且默认为private声明的可访问性,因为结构是隐式密封的。 在结构中引入的struct成员(即,不由该结构inheritance)不能具有受保护或受保护的内部声明的可访问性。 (请注意,声明为结构成员的类型可以具有公共,内部或私有声明的可访问性,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
  • 接口成员隐式具有公共声明的可访问性。 接口成员声明中不允许访问修饰符。
  • 枚举成员隐式具有公共声明的可访问性。 枚举成员声明中不允许访问修饰符。

完整的。 并且有些人实际上更喜欢在他们的代码中明确他们的方法上的访问修饰符。

对于对称性和符合编码样式,喜欢一切都是明确的(我个人喜欢它…)

使用private明确表示您的意图并为其他支持您的代码的人留下线索;)

某些编码样式建议您首先放置所有“公共”项目,然后是“私有”项目。 没有“私人”关键字,你就无法这样做。

更新:我没有注意到这个“c#”标签,所以我的回答更多地适用于C ++而不是C#。

我通常会私下离开,但我觉得它对排队代码很有用:

 private int x; public string y; protected float z; 

VS:

 int x; public string y; protected float z; 

正如Robert Paulson在他的回答中所说, private修饰符不仅用于成员,还用于类型 。 这变得很重要,因为类型的默认值是internal ,如果使用InternalsVisibleToAttribute ,它可能会无意中泄漏。

实际上,如果未使用访问修饰符声明类或结构,则默认为内部。

因此,如果您想将其设为私有,请使用私有。