C#:为什么成员的可访问性修饰符是可选的(而不是必需的)?

时间:2012-05-17 04:56:59

标签: c# access-specifier

我已经阅读了Eric Lippert撰写的非常好的blog post,但它没有解释辅助功能修饰符的具体情况。

传统的stackoverflow wisdom表示总是明确指定“私有”,这意味着成员应该需要修饰符。

3 个答案:

答案 0 :(得分:1)

嗯,如果没有定义,那就不会设置默认修饰符。在C#中,即使您没有指定,也会设置默认修饰符,有时您可能想知道程序的默认修饰符以执行您的方式(预期结果)。

enumstructclass在典型情况下(在命名空间中或仅在文件中独自坐着)默认为internal,但会默认在结构或类中声明时private

所有方法,字段和属性都将默认访问修饰符设置为“私有”。

答案 1 :(得分:0)

可能C#的设计师想要并且喜欢“宗教”打架是否包含退款商访问修饰符?

(如果只能使用一个访问级别,则访问修饰符通常不允许:例如,接口或枚举的成员始终为public但不允许写一下。partial方法总是private但是你不能写出来。由于static构造函数不能被显式调用,所以没有有意义的访问级别。显式的接口实现直接调用不是真的可见,但可以通过接口类型自由访问(如果从外部可以看到接口类型)。命名空间可以没有访问修饰符。)

与你建议的相反的规则当然是规则,说不允许指定不改变任何东西的修饰符。这意味着命名空间的直接成员(包括隐式“全局命名空间”)无法显式声明internal,并且类或结构的成员(包括嵌套类型)不能拥有关键字{ {1}}。有些人使用这种惯例。

请注意,属性和索引器的getter和setter无法指定冗余访问级别。这里唯一允许的是两个访问者中的一个(在这种情况下必须有两个)来指定更严格的访问。

答案 2 :(得分:0)

通常会遇到这种类型的问题,只有那些创建该语言的人才能得出确定的答案(当然,假设文档中未解决该问题)。

但是可以肯定地说,这是因为in the words of David Naugler除了是基于C的语言之外,“ C#受到Java [和] C ++的强烈影响,最好将其视为两者的后代。...

作为旁注,Anders Hejlsberg是Turbo Pascal的原始作者和Delphi的首席架构师,也是creation of C#背后的首席架构师。

我意识到这是在回避问题,所以您现在可以问为什么C ++最初允许可选的可见性修饰符= p