Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 名称空间内的私有类_C#_Oop - Fatal编程技术网

C# 名称空间内的私有类

C# 名称空间内的私有类,c#,oop,C#,Oop,可能重复: 我想要的是有一个只有同一名称空间中的其他类才能访问的类,而不必将名称空间放在它自己的程序集中 这在C#中是不可能的,有什么原因吗 Edit:我对问题做了一些修改,因为编译器告诉我不允许使用private。谁能告诉我原因吗?这是不可能的 只能使用internal修饰符限制对包含类的程序集的访问 还可以通过将类设置为嵌套类,将对该类的访问限制为单个类。例如,如果将类B设置为类a中的私有嵌套类,则B只能由a访问 我认为这两种选择是你能做的最好的选择。如果确实要限制对命名空间的访问,则必须

可能重复:

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


这在C#中是不可能的,有什么原因吗

Edit:我对问题做了一些修改,因为编译器告诉我不允许使用
private
。谁能告诉我原因吗?

这是不可能的

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

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

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


编辑:第二个问题:为什么不允许使用私有类。只有当私有类嵌套在另一个类中时,才允许它们。如果将非嵌套类设为私有,它有什么用途?您无论如何都无法访问它,因此无法对其执行任何操作。

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

可以通过使用
内部
类来限制对当前程序集的可见性

但是,可以允许另一个部件使用该属性获得部件的可见性

示例

在assembly AssemblyOne中定义MyInternalClass:

[assembly: InternalsVisibleTo("AssemblyTwo")]

internal class MyClass {
    internal void DoSomeAction() { }
}
然后在AssemblyTwo中定义另一个类:

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

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


如果没有,我们就很难理解行为(命名空间中的一个类型可以看到您的类型,另一个-no)。如果是,则与“private”的定义相矛盾,因为不同程序集中的类型可以访问程序集的“private”详细信息。

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

为什么要有“名称空间可见性”?这将意味着一种特殊的公共类型,因为任何人都可以将自己的类声明为在所需的命名空间中,从而访问您的类


如果您想将其作为安全功能,这将不起作用。如果您想通过隐藏“内部”类来分离名称空间,例如,您可以在主名称空间下面有一个内部名称空间。

是否有未被询问的问题?我写问题的时候没注意到这一点。但有什么能解释为什么会这样吗?呵呵。。。我想知道人们怎么能这么快找到重复的帖子,尽管它甚至没有列在右边的“相关”部分@詹姆斯:你是怎么做到的?:)也许如果你说你为什么需要这样做,人们可以给你提供其他选择?就目前情况而言,你想做的是不可能实现的。@Phil,我理解其他选择。我只是想理解其中的逻辑。也许这个地方不适合问这个问题。例如:在java中,你有一个“一切都是虚拟的,除非它是最终的”类型的东西,而在C中,你必须将某些东西标记为虚拟的。我理解这是为什么,我只是想理解为什么在C#中没有“包私有”之类的东西。这更多的是一个“为什么”而不是一个“如何”的问题。@blacklion:我理解。我几乎觉得你想做的是“错误的”,因为我已经习惯了事情的现状。虽然似乎确实存在限制某些类的可重用性的有效案例,但我可以想象代码结构很快变得相当复杂。也许这只是一个接吻的例子?这在C#中是不可能的吗?为什么创作者不允许这样做?这里很难提问。我得非常小心地说出来。编辑:例如,类中的类型允许私有,并且类中的所有内容都可以访问它们。private不限制对某个类型的所有访问。我不理解您的评论。这是一个问题吗?如果是,请重新措辞或提供更多细节。或者你认为我的回答错了吗?呃,隐私并没有限制你回答所暗示的所有访问。私有类(在我的小世界:)不会不可访问,只能在名称空间中访问。但我似乎误解了名称空间是什么,没错。如果名称空间与类型类似,则此名称空间中的每个类都可以访问私有类。但我们现在知道,名称空间只是某种标识符,因此任何人/任何东西都无法访问私有类。我想在你编辑了你的问题之后,我误解了它的意图。所以名称空间只是为了避免冲突,而不是像文件夹那样分组?名称空间仅为其包含的类型提供上下文-这就是您所说的吗?@blacklion:将名称空间视为类型的唯一标识符。它允许您拥有两个同名的类,例如,
System.DateTime
不同于
MyNamespace.DateTime
谢谢,我想我是在考虑用JavaThank编写的包,这不是我的问题though@blacklion:是的,它不限制命名空间的可见性。我误解了你的问题。参见Thibault Falise关于内部可视性的回答