我想要的是拥有一个只能在同一命名空间内的其他类访问的类,而不必将命名空间放在它自己的程序集中。
有没有理由在C#中无法做到这一点?
编辑:我稍微更改了一下这个问题,因为编译器告诉我不允许使用private
。谁能告诉我这个的原因?
答案 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命名空间,例如。