考虑"私有"是类成员的默认访问修饰符,为什么关键字甚至需要?
这里有一定数量的错误信息:
"默认访问修饰符不是私有的,而是内部的"
那么,这取决于你在谈论什么.对于某类型的成员,它是私有的.对于顶级类型本身,它是内部的.
"私有只是类型上方法的默认值"
不,它是类型的所有成员的默认值- 属性,事件,字段,运算符,构造函数,方法,嵌套类型以及我忘记的任何其他内容.
"实际上,如果未使用访问修饰符声明类或结构,则默认为内部"
仅适用于顶级类型.对于嵌套类型,它是私有的.
除了限制一个部分的属性访问而不限制另一个部分的属性访问之外,默认基本上总是"尽可能限制".
就个人而言,我在是否明确的问题上犹豫不决.使用默认值的"专业人士"是它突出显示您正在制作比最严格的级别更可见的内容.明确指定它的"专家"是那些不了解上述规则的人更明显,它表明你已经考虑了一下.
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; } }
private关键字是实现此目的所必需的,因为附加的属性可访问性修饰符只能缩小范围,而不能扩大范围.(否则,可能已创建私有(默认情况下)属性,然后添加公共修饰符.)
Private仅是类型上方法的默认值,但private修饰符在别处使用.
来自C#语言规范3.0(msdn)第3.5.1节
根据成员声明发生的上下文,仅允许某些类型的已声明可访问性.此外,当成员声明不包含任何访问修饰符时,发生声明的上下文确定默认声明的可访问性.
命名空间隐式具有公共声明的可访问性.命名空间声明中不允许访问修饰符.
在编译单元或名称空间中声明的类型可以具有公共或内部声明的可访问性,并且默认为内部声明的可访问性.
类成员可以具有五种声明的可访问性中的任何一种,并且默认为私有声明的可访问性.(请注意,声明为类成员的类型可以具有任何五种声明的可访问性,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性.)
结构成员可以具有公共,内部或私有声明的可访问性,并且默认为私有声明的可访问性,因为结构是隐式密封的.在结构中引入的struct成员(即,不由该结构继承)不能具有受保护或受保护的内部声明的可访问性.(请注意,声明为结构成员的类型可以具有公共,内部或私有声明的可访问性,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性.)
接口成员隐式具有公共声明的可访问性.接口成员声明中不允许访问修饰符.
枚举成员隐式具有公共声明的可访问性.枚举成员声明中不允许访问修饰符.