4

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

  • public - 在任何程序集中可用
  • 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");
        }
    }
}
4

4 回答 4

8

嵌套类型可以声明为私有的、受保护的或受保护的内部类型。当然,您仍然可以将嵌套类型声明为公共或内部类型 - 只是您只能在嵌套时使用上述访问修饰符声明它们:

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

请注意,您不能声明嵌套在 a 中的类型structto beprotected或者protected internal因为这样做没有任何意义:)

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

C# 不允许将类型嵌套在接口中(不幸的是,IMO - 这对代码合同很有用)。

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

于 2010-07-21T13:14:34.960 回答
3

看看这个MSDN 页面

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

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

于 2010-07-21T13:15:54.880 回答
3

答案在可访问性级别中找到。

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

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

于 2010-07-21T13:17:50.057 回答
0

In the context of this question it might be interesting to point out that there is a not so well known mechanism for making internal classes visible to other assemblies. That mechanism is the InternalsVisibleTo attribute. It is not considered one of the access modifiers by any stretch, but does have the effect of manipulating who has access. The concept is referred to as friend assemblies.

于 2010-07-21T14:25:59.080 回答