如何防止从命名空间内访问类?

Posted

技术标签:

【中文标题】如何防止从命名空间内访问类?【英文标题】: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 限制为相同的程序集。含义:不能从其他程序集访问该类,但可以从同一程序集的其他命名空间访问该类。这可能是你想要的,但不是你所要求的。 【参考方案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 之外访问

【讨论】:

谢谢 - 您如何看待发布代码的更新?

以上是关于如何防止从命名空间内访问类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个 C++ 命名空间内的全局命名空间中定义朋友?

js单例——如何避免通过命名空间访问类成员

如何获取命名空间中的所有类?

什么是程序冲突?/命名空间可以防止冲突吗?

C#中如何获得指定命名空间中所有自定义类的信息

获取命名空间内的所有类[重复]