命名空间内的私有类

时间:2010-04-16 08:18:08

标签: c# oop

  

可能重复:
  Namespace only class visibility in C#/.NET ?

我想要的是拥有一个只能在同一命名空间内的其他类访问的类,而不必将命名空间放在它自己的程序集中。

有没有理由在C#中无法做到这一点?

编辑:我稍微更改了一下这个问题,因为编译器告诉我不允许使用private。谁能告诉我这个的原因?

5 个答案:

答案 0 :(得分:7)

这是不可能的。

您只能使用internal修饰符限制对包含该类的程序集的访问权限。

您还可以通过将类设置为嵌套类来将对类的访问限制为单个。例如。如果你将B类作为A类中的私有嵌套类,B只能由A访问。

我认为这两个选项是你能做的最好的选择。如果您真的想限制对命名空间的访问,则必须将其放在单独的程序集中。

编辑:关于第二个问题:为什么不允许私人课程。仅当私有类嵌套在另一个类中时才允许使用私有类。如果将非嵌套类设为私有,它的用途是什么?无论如何你都无法访问它,所以你无法用它做任何事情。

答案 1 :(得分:3)

您可以使用internal类限制当前程序集的可见性。

但是,您可以允许其他程序集使用InternalsVisibleTo属性来查看程序集。

示例

在程序集AssemblyOne中定义MyInternalClass:

[assembly: InternalsVisibleTo("AssemblyTwo")]

internal class MyClass {
    internal void DoSomeAction() { }
}

然后在AssemblyTwo中定义另一个类:

public class MyOtherClass
{
    public void DoAnotherAction()
    {
        MyClass c = new MyClass();
        c.DoSomeAction();
    }
}

答案 2 :(得分:2)

除了gehho的回答:命名空间只是类型名称的一部分(只允许所有类型都有唯一的名称) - 这就是为什么你不能限制对命名空间内类型的访问。

答案 3 :(得分:0)

因为您可以在任何其他外部程序集中向命名空间添加类型。类型是否在同一名称空间中,但是不同的程序集会看到您的“私有类型”?

如果不是,我们很难理解(命名空间中的一种类型可以看到您的类型,另一种类型 - 不 - )。如果是,我们与“私有”的定义相矛盾,因为不同程序集中的类型可以访问程序集的“私有”细节。

答案 4 :(得分:0)

您可以声明任意名称空间,因此您可以将自己的类声明为System名称空间的一部分。当然,如果Microsoft决定在其命名空间中添加具有相同名称的类,则会导致错误。

为什么要拥有“名称空间可见性”?这意味着一种特殊的公共形式,因为任何人都可以声明他们的类在所需的命名空间中,从而访问你的类。

如果您希望将其作为安全功能,则无法使用。如果你想通过隐藏“内部”类来整理你的命名空间,你可以在主命名空间下面有一个Internals命名空间,例如。