考虑到"私人"被默认接改用于类成员,为什么是关键词甚至需要?

有帮助吗?

解决方案

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

其他提示

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

  

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

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

  

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

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

  

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

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

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

就个人而言,我是否要明确这个问题。 “专业”使用默认值时,它会突出显示您创建比最严格级别更明显的内容。 “专业”明确指出它对于那些不了解上述规则的人来说更明显,并且它表明你已经考虑了一点。

Eric Lippert采用明确的形式,我也开始倾向于这种方式。

请参阅 http://csharpindepth.com/ViewNote.aspx?NoteID=54 再多说一点。

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

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

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

私人修饰符解释意图。

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

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

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

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

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

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

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

私人只是默认 方法 在一类型,但是私修改用于其他地方。

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

根据上下文在其成员宣言》,只有某些类型的宣布无障碍是允许的。此外,当成员声明不包括任何访问剂,下文在其《宣言》需要的地方确定默认声明的可访问性。

  • 名字空间隐含有公开宣布的访问。没有访问的修饰语允许就名称空间声明。
  • 类型声明的编译单位或名称空间可以有公开或内部宣布无障碍和默认的 内部宣布无障碍。
  • 类成员 可能有任何的五种类的声明可获得性和默认到私人宣布无障碍。(注意这一类型宣布作为成员的一类可能有任何的五种宣布的访问,而一型宣布作为成员的一个名字空间只能有公开或内部宣布无障碍。)
  • 结构成员可以拥有公共、国内、或者私人宣布无障碍和默认到私人宣布性的,因为结构是隐密封。结构成员介绍了在一个结构(即,不继承的通过,结构)无法保护或保护的内部宣布无障碍。(注意这一类型宣布作为成员的一个结构可以有公共、国内、或者私人宣布无障碍,而型宣布作为成员的一个名字空间只能有公开或内部宣布无障碍。)
  • 接口成员的隐含有公开宣布的访问。没有访问剂是允许对口部件的声明。
  • 枚举的成员隐含有公开宣布的访问。没有访问的修饰语上允许举件的声明。

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

为了对称并符合喜欢一切要明确的编码风格(我个人喜欢它......)

使用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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top