C#/。NET中仅名称空间的类可见性?

问题描述 投票:82回答:5

在C#中,您能否使一个类仅在其自己的名称空间中可见,而不必使用其他程序集?这对于不应该在其他地方使用的典型帮助器类似乎很有用。(即Java所谓的package-private类)

c# .net
5个回答
32
投票

我不认为您想要的是可能的。


74
投票

您可以将类设为internal,但这只会阻止assembly之外的任何人使用该类。但是您仍然必须为要使用此名称空间的每个名称空间创建一个separate assembly。我假设这就是为什么您想要这样做的原因。

获取C#编译器以强制命名空间可见性

[这里有一篇文章(Namespace visibility in C#),展示了一种使用部分类作为“假名称空间”形式的方法,您可能会觉得有用。

作者指出,这并不完美,他讨论了缺点。主要问题是C#设计人员已设计C#not以这种方式工作。这严重偏离了C#/。NET中的预期编码实践,这是.NET Framework的最大优势之一。

这是一个巧妙的把戏……现在不要这样做。


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
    }
}

本质上,实现所需目标的唯一方法是将外部类用作命名空间的形式并限制在该类之内。


0
投票

如果您有单个程序集,则可以根据需要在该程序集中定义多个名称空间,但是无论您在IDE中应用什么修饰符,您始终可以在其他名称空间中看到类。


0
投票

不确定是否直接可行,但有几种伪造它的好方法是:

© www.soinside.com 2019 - 2024. All rights reserved.