【问题标题】:How to prevent access to a class from within a namespace?如何防止从命名空间内访问类?
【发布时间】:2021-09-28 13:06:03
【问题描述】:

如何防止在 C# 中使用其命名空间之外的类?

例如,我有两个命名空间。一个定义了一个数据模型类,另一个定义了一个继承第一个的数据模型类。第二个命名空间还定义了一个实用程序类,它是唯一允许使用第二个数据模型类的类..

namespace A
{
    public class ModelA {} // can be used by any class
}

namespace B
{
    class ModelB : ModelA {} // can only be used by Utility

    public class Utility
    {
        public void DoSomething()
        {
            var item = new ModelB {};
            ...
        }
    }
}

通过在另一个类库或项目中实现以下代码,我想要cmets指示的效果...

namespace C
{
    public class Stuff
    {
        public void DoThings()
        {
            var a = new ModelA(); // this should work
            var b = new ModelB(); // this should not work
        }
    }
}

【问题讨论】:

  • 将 ModelB 设为 Utility 中的私有类。
  • 进一步测试了这一步,我意识到我刚刚对帖子所做的更改可能是正确的。类的默认访问修饰符是内部的,所以这应该可以工作。
  • 你想阻止 Utility 使用 ModelA,对吧?
  • @dzianis-karpuk 不。代码 cmets 解释了应该访问的内容。
  • @MattW internal 限制为相同的程序集。含义:不能从其他程序集访问该类,但可以从同一程序集的其他命名空间访问该类。这可能是你想要的,但不是你所要求的。

标签: c# namespaces access-modifiers


【解决方案1】:

您不能将private 访问修饰符添加到直接包含在命名空间中的类。

但是,您可以将 ModelB 设为私有嵌套类:

namespace A
{
    class ModelA {} // can be used by any class
}

namespace B
{
    class Utility
    {
        private class ModelB : ModelA {} // can only be used by Utility
        
        public void DoSomething()
        {
            var item = new ModelB {};
            ...
        }
    }
}

这意味着,与任何其他私有财产一样,它不能在Utility-class 之外访问

【讨论】:

  • 谢谢 - 您如何看待发布代码的更新?
猜你喜欢
  • 1970-01-01
  • 2015-01-08
  • 2014-03-31
  • 2013-11-07
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2010-11-22
  • 2018-02-03
相关资源
最近更新 更多