考虑到“private”是类成员的默认访问修饰符,为什么甚至需要关键字?
13 回答
这里有一定数量的错误信息:
“默认访问修饰符不是私有的而是内部的”
嗯,这取决于你在说什么。对于一个类型的成员,它是私有的。对于顶级类型本身,它是内部的。
“私有只是类型上方法的默认值”
不,它是类型的所有成员的默认值——属性、事件、字段、运算符、构造函数、方法、嵌套类型以及我忘记的任何其他内容。
“实际上,如果未使用访问修饰符声明类或结构,则默认为内部”
仅适用于顶级类型。对于嵌套类型,它是私有的。
除了限制一个部分而不是另一部分的属性访问之外,默认值基本上总是“尽可能限制”。
就个人而言,我在是否明确的问题上犹豫不决。使用默认值的“优点”是它突出显示您正在制作的东西比最严格的级别更明显的任何地方。明确指定它的“优点”是对于不了解上述规则的人来说更明显,并且表明您已经考虑了一点。
Eric Lippert 采用显式形式,我也开始采用这种方式。
它是给你(和未来的维护者)的,而不是编译器。
明确性。我从不使用默认值,总是显式添加修饰符。
这可能是因为我的 Java 背景默认是“包”(大致相当于 C# 中的“内部”),所以这种差异一直困扰着我。我发现明确性更可取。
我现在也使用 ReSharper,它默认是显式的,所以它只会确认和加强我的偏见:)
private 修饰符解释意图。
私有成员变量不适用于类外的直接操作。可能会或可能不会为变量创建 get/set 访问器。
私有方法不打算在类外使用。这可能仅适用于内部功能。或者您可以将默认构造函数设为私有,以防止在不传入值的情况下构造类。
private 修饰符(和其他类似的修饰符)可能是编写自文档代码的有用方式。
正如 Jon Skeet 在他的《 C# In Depth》一书中所指出的, C#中有一个地方需要 private 关键字才能达到效果。
如果我没记错的话,private 关键字是创建私有作用域的属性 getter 或 setter 的唯一方法,当它的对立面具有大于私有可访问性时。例子:
public bool CanAccessTheMissileCodes
{
get { return canAccessTheMissileCodes; }
private set { canAccessTheMissileCodes = value; }
}
需要private 关键字来实现这一点,因为附加的属性可访问性修饰符只能缩小范围,不能扩大范围。(否则,可能已经能够创建一个私有(默认)属性,然后添加一个公共修饰符。)
Private 只是类型上方法的默认值,但 private 修饰符在其他地方使用。
来自C# 语言规范 3.0 (msdn)第 3.5.1 节
根据成员声明发生的上下文,仅允许某些类型的声明可访问性。此外,当成员声明不包含任何访问修饰符时,发生声明的上下文决定了默认声明的可访问性。
- 命名空间隐含地具有公开声明的可访问性。命名空间声明中不允许使用访问修饰符。
- 在编译单元或命名空间中声明的类型可以具有公共或内部声明的可访问性,并且默认为内部声明的可访问性。
- 类成员可以具有五种声明的可访问性中的任何一种,并且默认为私有声明的可访问性。(请注意,声明为类成员的类型可以具有五种声明的可访问性中的任何一种,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
- 结构成员可以具有公共、内部或私有声明的可访问性,并且默认为私有声明的可访问性,因为结构是隐式密封的。在结构中引入的结构成员(即不被该结构继承)不能具有受保护或受保护的内部声明的可访问性。(请注意,声明为结构成员的类型可以具有公共、内部或私有声明的可访问性,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
- 接口成员隐式地具有公开声明的可访问性。接口成员声明中不允许使用访问修饰符。
- 枚举成员隐含地具有公开声明的可访问性。枚举成员声明中不允许使用访问修饰符。
为了完整性。有些人实际上更喜欢在他们的代码中明确说明他们方法上的访问修饰符。
为了对称并符合喜欢一切都是明确的编码风格(我个人喜欢它......)
一些编码风格建议您首先放置所有“公共”项目,然后是“私人”项目。如果没有“private”关键字,你就不能那样做。
更新:我没有注意到上面的“c#”标签,所以我的回答更多地适用于 C++ 而不是 C#。
使用 private 明确表明您的意图,并为支持您的代码的其他人留下线索;)
我通常将 private 排除在外,但我发现它对排列代码很有用:
private int x;
public string y;
protected float z;
对比:
int x;
public string y;
protected float z;
正如罗伯特保尔森在回答中所说,private
修饰符不仅用于成员,还用于类型。internal
这变得很重要,因为如果您使用InternalsVisibleToAttribute,类型的默认值可能会意外泄漏。
实际上,如果未使用访问修饰符声明类或结构,则默认为内部。
因此,如果您想将其设为私有,请使用私有。