考虑“private”是类成员的默认访问修饰符,为什么关键字甚至需要?
答案 0 :(得分:68)
这里有一定数量的错误信息:
“默认访问修饰符不是私有的,而是内部的”
嗯,这取决于你在谈论什么。对于某类型的成员,它是私有的。对于顶级类型本身,它是内部的。
“私有”只是类型“
上方法的默认值
不,这是类型的所有成员的默认值 - 属性,事件,字段,运算符,构造函数,方法,嵌套类型以及我忘记的任何其他内容。
“实际上,如果未使用访问修饰符声明类或结构,则默认为内部”
仅适用于顶级类型。对于嵌套类型,它是私有的。
除了限制一个部分的属性访问而不限制另一个部分的属性访问之外,默认基本上总是“尽可能限制”。
就个人而言,我是否要明确这个问题。使用默认值的“专业人士”是,它突出显示您所创建的某些内容比最严格的级别更明显。明确指出它的“专业人士”是那些不了解上述规则的人更明显,它表明你已经考虑了一下。
Eric Lippert采用明确的形式,我也开始倾向于这种方式。
答案 1 :(得分:28)
适合您(以及未来的维护者),而不是编译器。
答案 2 :(得分:15)
明晰。我从不使用默认值并始终显式添加修饰符。
这可能是因为我的Java背景默认为'package'(大致相当于C#中的'internal'),因此差异总是困扰着我。我发现显而易见更适合。
我现在也使用ReSharper,默认是明确的,所以它只能证实并强化我的偏见:)
答案 3 :(得分:9)
私人修饰符解释意图。
私有成员变量不适用于类外的直接操作。可以或不可以为变量创建get / set访问器。
私有方法不适合在课外使用。这可能仅适用于内部功能。或者你可以将默认构造函数设为私有,以防止在不传入值的情况下构造类。
私有修饰符(以及其他类似的修饰符)可以是编写自我记录代码的有用方法。
答案 4 :(得分:7)
正如Jon Skeet在其着作 C#In Depth 中指出的那样,C#中有一个地方需要私有关键字来实现效果。
如果我的内存服务正确,那么private关键字是创建私有范围属性getter或setter的唯一方法,当它的反面具有大于私有可访问性时。例如:
public bool CanAccessTheMissileCodes
{
get { return canAccessTheMissileCodes; }
private set { canAccessTheMissileCodes = value; }
}
私有关键字是必需来实现这一点,因为额外的属性可访问性修饰符只能缩小范围,而不能扩大范围。 (否则,可能已创建私有(默认情况下)属性,然后添加公共修饰符。)
答案 5 :(得分:5)
私有只是类型上方法的默认值,但私有修饰符用于其他地方。
来自C# Language Specification 3.0 (msdn)第3.5.1节
根据成员声明发生的上下文,仅允许某些类型的声明可访问性。此外,当成员声明不包含任何访问修饰符时,发生声明的上下文确定默认声明的可访问性。
- 命名空间隐式具有公共声明的可访问性。命名空间声明中不允许使用访问修饰符。
- 在编译单元或命名空间中声明的类型可以具有公共或内部声明的可访问性和默认值 内部声明的可访问性。
- 类成员可以具有五种声明的可访问性中的任何一种,并且默认为私有声明的可访问性。 (请注意,声明为类成员的类型可以具有五种声明的可访问性中的任何一种,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
- 结构成员可以具有公共,内部或私有声明的可访问性,并且默认为私有声明的可访问性,因为结构是隐式密封的。在结构中引入的struct成员(即,不由该结构继承)不能具有受保护或受保护的内部声明的可访问性。 (请注意,声明为结构成员的类型可以具有公共,内部或私有声明的可访问性,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
- 接口成员隐式具有公共声明的可访问性。接口成员声明中不允许访问修饰符。
- 枚举成员隐式具有公开声明的可访问性。枚举成员声明中不允许访问修饰符。
答案 6 :(得分:3)
完成。有些人实际上更喜欢在他们的代码中明确关于他们方法的访问修饰符。
答案 7 :(得分:2)
为了对称并符合喜欢一切要明确的编码风格(我个人喜欢它......)
答案 8 :(得分:1)
某些编码样式建议您首先放置所有“公共”项目,然后是“私有”项目。没有“私人”关键字,你就无法这样做。
更新:我没有注意到“c#”标签,所以我的回答更多地适用于C ++而不是C#。
答案 9 :(得分:1)
使用private明确表示您的意图,并为将支持您的代码的其他人提供线索;)
答案 10 :(得分:1)
我通常会私下离开,但我觉得排队代码很有用:
private int x;
public string y;
protected float z;
VS
int x;
public string y;
protected float z;
答案 11 :(得分:1)
正如Robert Paulson在他的回答中所说,private
修饰符不仅用于成员,还用于类型。这一点很重要,因为类型的默认值为internal
,如果您使用InternalsVisibleToAttribute,则可能无意中泄露。
答案 12 :(得分:-1)
实际上,如果未使用访问修饰符声明类或结构,则默认为内部。
因此,如果您想将其设为私有,请使用私有。