内部类能否在其他命名空间中访问?

5
我目前正在网上阅读这本书: http://www.angelfire.com/theforce/chewy0/csharp/Thinking_in_C-Sharp_.pdf 在第23页(PDF文档的第38页)中指出,internal类不能从外部命名空间的类中访问。
然而,在在线Microsoft文档中,它指出internal类只能从相同的程序集中访问。

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/internal

从我的理解来看,一个程序集可以包含来自多个命名空间的类。 这是否意味着根据Microsoft文档,internal类可以在不同的命名空间中被访问? 还是说internal类只有在其所属的程序集命名空间内部才是私有的?
2个回答

3

这是摘录,对吧?

Java使用五个显式关键字来设置类中的边界: public、private、protected、internal和protected internal。它们的用途和含义非常直观。这些访问修饰符确定了谁可以使用后面的定义。public表示以下定义对每个人都可用。另一方面,private关键字意味着除了你作为类型的创建者在该类型的成员函数内,没有人可以访问那些定义。private是你和客户程序员之间的一堵墙。如果有人试图访问一个私有成员,他们会得到编译时错误。protected行为像private,唯一的例外是继承类有访问受保护的成员的权限,但没有访问私有成员的权限。继承将很快介绍。internal通常被称为“友好”——与public一样,其他命名空间中的类可以访问该定义,但不能被不同命名空间中的类访问。命名空间将在第#ref#章节中深入讨论。protected internal允许在同一命名空间中的类(与internal相同)或继承类(与protected相同)访问,即使继承的类不在同一命名空间中。

C#的默认访问级别是internal,如果您不使用上述修饰符,则会起作用。

作者可能混淆了Java的internal和c#的internal.

它们有些不同,因为Java没有程序集;它有包,将类组织成命名空间。

在c#中,命名空间与访问修饰符没有任何关系。只有同一程序集中的类可以访问internal类型或成员,除非您使用InternalsVisibleTo属性。命名空间无关紧要。


2
好的,最简单的回答方法就是测试它 - 所以我在一个程序集中创建了2个命名空间,并访问了一个内部变量。
简短的回答是 - Microsoft文档是正确的 - 即使您有2个不同的命名空间,也可以在同一程序集中访问内部变量。
以下是代码:
namespace ConsoleApplication1
{
    class Class1
    {
        internal string thing;
        public Class1()
        {
            thing = "original data";
        }
    }
}

namespace ConsoleApplication2
{
    class Class2
    {
        public ConsoleApplication1.Class1 class1= new ConsoleApplication1.Class1();
        public Class2()
        {
            class1.thing = "other namespace modification";
        }
    }
}

当调用Class2构造函数时,修改的数据被显示出来。
var class2 = new ConsoleApplication2.Class2();
Console.WriteLine(class2.class1.thing);

结果:

"other namespace modification"

希望这有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接