"私有"修饰符有什么作用?
考虑到"私有"是类Member的默认访问修饰符,为什么甚至需要关键字?
解决方案
它是给我们(以及将来的维护者)的,而不是编译器。
明确的。我从不使用默认值,并且总是显式添加修饰符。
这可能是因为我的Java背景默认设置为" package"(大致相当于C#中的" internal"),所以这种区别总是困扰我。我发现明确是可取的。
我现在也使用ReSharper,它默认是显式的,因此它仅确认并加强了我的偏见:)
为了对称并符合喜欢一切都明确的编码样式(个人而言,我喜欢...)
某些编码样式建议我们将所有"公共"项目放在首位,然后再放置"私有"项目。没有"私人"关键字,我们将无法做到这一点。
更新:我没有注意到" c#"标签,因此我的回答更适用于C ++,而不适用于C#。
为了完整。实际上,有些人更喜欢在代码中明确说明其方法上的访问修饰符。
实际上,如果未使用访问修饰符声明类或者结构,则默认为内部。
因此,如果要使其私有,请使用私有。
private修饰符解释意图。
私有成员变量不适用于类外的直接操作。可能会或者可能不会为变量创建get / set访问器。
私有方法不适用于该类之外的对象。这可能仅用于内部功能。或者,我们可以将默认构造函数设为私有,以防止在不传递值的情况下构造类。
private修饰符(以及其他类似的修饰符)可能是编写自我记录代码的有用方法。
使用私有显式表示意图,并为支持代码的其他人提供线索;)
私有只是类型上方法的默认设置,而私有修饰符则在其他地方使用。
摘自CLanguage Specification 3.0(msdn)第3.5.1节
Depending on the context in which a member declaration takes place, only certain types of declared accessibility are permitted. Furthermore, when a member declaration does not include any access modifiers, the context in which the declaration takes place determines the default declared accessibility. Namespaces implicitly have public declared accessibility. No access modifiers are allowed on namespace declarations. Types declared in compilation units or namespaces can have public or internal declared accessibility and default to internal declared accessibility. Class members can have any of the five kinds of declared accessibility and default to private declared accessibility. (Note that a type declared as a member of a class can have any of the five kinds of declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility.) Struct members can have public, internal, or private declared accessibility and default to private declared accessibility because structs are implicitly sealed. Struct members introduced in a struct (that is, not inherited by that struct) cannot have protected or protected internal declared accessibility. (Note that a type declared as a member of a struct can have public, internal, or private declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility.) Interface members implicitly have public declared accessibility. No access modifiers are allowed on interface member declarations. Enumeration members implicitly have public declared accessibility. No access modifiers are allowed on enumeration member declarations.
我通常不公开使用,但是我发现它对于排队代码很有用:
private int x; public string y; protected float z;
VS:
int x; public string y; protected float z;
正如乔恩·斯凯特(Jon Skeet)在他的著作《 CIn Depth》中指出的那样,在C中有一个地方需要private关键字才能实现效果。
如果我的记忆正确运行,则当私有关键字的对立属性大于私有可访问性时,private关键字是创建私有范围的属性getter或者setter的唯一方法。例子:
public bool CanAccessTheMissileCodes { get { return canAccessTheMissileCodes; } private set { canAccessTheMissileCodes = value; } }
必须使用private关键字才能实现此目的,因为添加的属性可访问性修饰符只能缩小范围,而不能扩大范围。 (否则,可能已经能够创建一个私有(默认情况下)属性,然后添加一个公共修饰符。)
正如罗伯特·保尔森(Robert Paulson)在回答中所说的那样," private"修饰符不仅用于成员,而且还用于类型。这一点很重要,因为类型的默认值为"内部",如果我们使用InternalsVisibleToAttribute可能会意外泄漏。
这里存在一定数量的错误信息:
"The default access modifier is not private but internal"
好吧,这取决于我们在说什么。对于类型的成员,它是私有的。对于顶级类型本身,它是内部的。
"Private is only the default for methods on a type"
不,这是类型属性,事件,字段,运算符,构造函数,方法,嵌套类型以及我遗忘的所有其他内容的所有成员的默认值。
"Actually, if the class or struct is not declared with an access modifier it defaults to internal"
仅适用于顶级类型。对于嵌套类型,它是私有的。
除了限制一部分的属性访问而不限制另一部分的属性外,默认值基本上始终是"尽可能严格"。
就个人而言,我在是否明确的问题上犹豫不决。使用默认设置的"优点"是,它突出显示了我们在使某些内容比最严格的级别更具可见性的任何位置。明确指定它的"优点"是对那些不了解上述规则的人来说更明显,并且它表明我们已经考虑了一下。
埃里克·利珀特(Eric Lippert)采用显式形式,我也开始采用这种方式。
有关更多信息,请参见http://csharpindepth.com/ViewNote.aspx?NoteID=54.