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

时间:2010-07-21 13:11:44

标签: c# oop access-modifiers

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

  • 公开 - 可在任何程序集中使用
  • 内部 - 仅在当前程序集中可用

但下面的错误消息似乎暗示如果一个类在命名空间中定义,它可以被定义为 private protected ,或受保护的内部

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");
        }
    }
}

4 个答案:

答案 0 :(得分:8)

嵌套类型可以声明为private,protected或protected 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 - 它对代码契约很有用)。

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

答案 1 :(得分:3)

看看这个MSDN page

  

命名空间中的类型声明可以具有公共访问权限或内部访问权限。 如果未指定辅助功能,则默认为内部。

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

答案 2 :(得分:3)

答案可在Accessibility Levels找到。

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

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

答案 3 :(得分:0)

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