命名空间只有C#/ .NET中的类可见性?

nos*_*nos 78 .net c#

在C#中,你可以只在它自己的命名空间内看到一个类,而不是在不同的程序集中吗?这对于不应在别处使用的典型帮助程序类似乎很有用.(即java调用包私有类)

Rob*_*ino 70

您可以创建类,internal但这只能阻止程序集之外的任何人使用该类.但是,您仍然必须为要执行此操作的每个命名空间创建单独的程序集.我猜想这就是为什么你会不会想这样做.

让C#编译器实现命名空间可见性

这里有一篇文章(C#中的命名空间可见性),它显示了一个使用部分类作为"假名称空间"形式的方法,您可能会发现它有用.

作者指出,这并不完美,他讨论了这些缺点.主要问题是C#设计者设计的C#不能以这种方式工作.这与C#/ .NET中的预期编码实践大相径庭,这是.NET Frameworks最大的优势之一.

这是一个巧妙的伎俩...现在要这样做.

  • 我尝试了它并且它工作但我感觉很脏! (13认同)
  • 事实也是.NET Framework也使用这个*整洁的技巧*. (2认同)
  • 刚刚找到一个例子:`System.Net.Mime.MediaTypeNames.Application` (2认同)

Ste*_*dit 31

我不认为你想要的是可能的.


Shu*_*oUk 21

内部是装配(严格来说是模块)隐私.它对命名空间可见性没有影响.

从同一程序集中的其他类实现类隐私的唯一方法是将类作为内部类.

此时,如果类是私有的,则对于不在该类或外部类本身中的任何内容,它是不可见的.

如果受到保护,那么每个人都可以看到它在私有时可以看到它,但对于外部类的子类也是可见的.

public class Outer
{
    private class Hidden     { public Hidden() {} }
    protected class Shady    { public Shady() {} }
    public class Promiscuous { public Promiscuous() {} }
}

public class Sub : Outer
{
    public Sub():base() 
    {
        var h = new Hidden();      // illegal, will not compile
        var s = new Shady();       // legal
        var p = new Promiscuous(); // legal
    }
}

public class Outsider 
{
    public Outsider() 
    {
        var h = new Outer.Hidden();      // illegal, will not compile
        var s = new Outer.Shady()        // illegal, will not compile
        var p = new Outer.Promiscuous(); // legal
    }
}
Run Code Online (Sandbox Code Playgroud)

本质上,实现所需内容的唯一方法是使用外部类作为命名空间的一种形式并限制在该类中.