【问题标题】:What kind of access modifiers can be applied to a class?什么样的访问修饰符可以应用于一个类?
【发布时间】:2011-03-18 23:49:34
【问题描述】:

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

  • public - 可用于任何程序集
  • 内部 - 仅在当前程序集中可用

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

您可以在类上使用的唯一类修饰符是 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");
        }
    }
}

【问题讨论】:

    标签: c# oop access-modifiers


    【解决方案1】:

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

    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 - 这对代码协定很有用)。

    其他嵌套类型(枚举、结构、接口、委托)也是如此。

    【讨论】:

    • 绝对值得了解,因为私有嵌套类非常有用。
    • 关键是命名空间不是容器,而类容器。可能的访问修饰符取决于它是否在容器中(例如,该类是否是成员)。
    • @Stephen:命名空间是一种容器:非嵌套类型是命名空间的成员。来自 C# 规范:“命名空间成员声明是命名空间声明(第 9.2 节)或类型声明(第 9.6 节)。”
    • @Jon:我的术语可以用工作——所有好名字都被取走了。 :) 重点是程序员经常陷入将命名空间视为类似于静态类的陷阱。我相信一个更正确的认识是所有顶级类型都是扁平的,命名空间只是用作名称前缀。一旦进行了这种心理调整,就会变得非常明显为什么顶级类型唯一可能的访问修饰符是公共的和内部的。
    【解决方案2】:

    看看这个MSDN page

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

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

    【讨论】:

      【解决方案3】:

      答案在Accessibility Levels

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2020-02-05
          • 2011-04-12
          • 2014-09-14
          • 1970-01-01
          • 2019-12-28
          • 2016-07-18
          • 2012-04-19
          • 1970-01-01
          • 2014-03-06
          相关资源
          最近更新 更多