【问题标题】:Scopes and nested namespaces for C#C# 的作用域和嵌套命名空间
【发布时间】:2011-12-24 02:46:56
【问题描述】:

我有一个 C# 项目,其中在单独的文件中定义了两个命名空间,其中一个是另一个的子集:

namespace RSSTimerJob

namespace RSSTimerJob.Features.RSSFilter

我有一个名为Toolbox 的静态类,它属于第一个命名空间。现在,当我尝试从第二个命名空间中的自定义类调用 Toolbox 类的受保护静态变量时,我收到一条错误消息,指出由于其保护级别而无法访问。

为什么它给我这个错误。由于第 2 个命名空间是第 1 个命名空间的子集,这是否意味着使变量受保护应该允许第 2 个命名空间的类看到它?

当然,将变量设置为 public 会使这个错误消失,但我只是好奇 :)

【问题讨论】:

    标签: c# namespaces nested scopes


    【解决方案1】:

    protected 不是您要使用的关键字。

    internal 允许将类的成员访问到同一程序集中的其他类

    在 C# 中,protected 允许访问从该基派生的类的基成员。您可能想到的是Java,其中protected 略有不同,因为它授予对同一包中的子类和类的访问权限。要在 C# 中获得大致相同的行为,您可以使用组合 protected internal,它包括 protectedinternal,授予对派生类的访问权限以及对同一个程序集。

    【讨论】:

    • 如您所说,受保护的内部是受保护的和内部的交集。此主电源访问权限仅授予也在同一程序集中的派生类。
    • A intersect B 表示 A 和 B 中的项目,不是吗?所以受保护的内部意味着访问受保护的(派生类)和内部的(同一个程序集)。
    • 你知道,我完全用错了。我道歉。无论如何,它不像你描述的那么严格,但我可能分类错误。会修复的。
    • 正确的思考方式是成员的自然状态是“私有”。 “受保护”削弱了这一点。 “内部”削弱了这一点。 “受保护的内部”会削弱它两次。
    • 你是绝对正确的。尽管我使用 C 和 C++ 编程,但我主要是 Java 程序员,因此与“受保护”关键字混淆。非常感谢!
    【解决方案2】:

    protected 表示该事物可用于类本身和派生的

    不过,我不会对命名空间发狂。如果您有很多东西要放入它们并且这些东西足够不同,它们就会很有用。这里有一些关于命名空间最佳实践的 guidelines

    【讨论】:

      【解决方案3】:

      “受保护”意味着可以从同一个类或派生类访问该成员。但这不允许同一命名空间的其他成员访问该成员。

      您正在寻找的可能是“内部”,这意味着可以通过同一程序集中的代码访问该成员。

      顺便说一下,您可以将更多成员从不同程序集添加到同一命名空间。

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 1970-01-01
        • 2019-08-03
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        相关资源
        最近更新 更多