什么样的访问修饰符可以应用于类?

经过一番研究后,我确定您可以应用于类的唯一访问修饰符是:

  • 公众 – 任何集会都有
  • internal – 仅在当前程序集中可用

但是下面的错误消息似乎暗示如果一个类没有在命名空间中定义,那么它可以被定义为privateprotectedprotected internal

public和internal是唯一可以在课堂上使用的类修饰符还是更多?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test2343434 { class Program { static void Main(string[] args) { Tools.ToolManager toolManager = new Tools.ToolManager(); Console.ReadLine(); } } } namespace Tools { //error: Elements defined in a namespace cannot be explicitly //declared as private, protected, or protected internal private class ToolManager { public ToolManager() { Console.WriteLine("inside tool manager"); } } } 

嵌套类型可以声明为private,protected或protected internal。 您仍然可以将嵌套类型声明为public或internal – 只是在嵌套时只能用上面的访问修饰符声明它们:

 public class OuterClass { private class PrivateNested {} protected class ProtectedNested {} protected internal class ProtectedInternalNested {} public class PublicNested {} internal class InternalNested {} } 

请注意,您不能声明嵌套在struct的类型要protectedprotected internal因为这样做没有任何意义:)

 public struct OuterStruct { private class PrivateNested {} public class PublicNested {} internal class InternalNested {} } 

C#不允许类型嵌套在接口中(遗憾的是,IMO – 它对代码契约很有用)。

所有这些对于其他嵌套类型(枚举,结构,接口,委托)也是如此。

看看这个MSDN页面 :

命名空间中的类型声明可以具有公共访问权限或内部访问权限。 如果未指定可访问性,则internal是默认值。

对于命名空间中的类型声明而言,除了公共到外部程序集或内部(C#不支持友元类的概念或类似的东西)之外,没有任何意义。

答案可在辅助function级别中找到。

“顶级”类(即不嵌套在另一个类中)只能是公共的或内部的。 默认情况下(如果您没有声明任何内容),它是内部的。

嵌套类可以具有所有五种可能的可访问级别,即公共,受保护,内部,私有,受保护的内部。

在这个问题的上下文中,可能有趣的是指出,有一种不太知名的机制可以使internal类对其他程序集可见。 该机制是InternalsVisibleTo属性。 它不被认为是任何一个访问修饰符之一,但确实具有操纵谁有权访问的效果。 这个概念被称为朋友集。