是否可以在其他名称空间中访问内部类?

时间:2017-06-23 22:51:38

标签: c# .net namespaces assemblies

我目前正在线阅读本书: http://www.angelfire.com/theforce/chewy0/csharp/Thinking_in_C-Sharp_.pdf

在第23页(PDF文档的第38页)中,它指出无法从外部名称空间中的类访问内部类。

但是,在线Microsoft文档中指出内部类只能从同一个程序集访问。

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

根据我的理解,程序集可以包含来自多个命名空间的类。 这不是从Microsoft文档中意味着可以跨不同的命名空间访问内部类吗?

或者说内部类在其受尊重的程序集名称空间中都是私有的吗?

2 个答案:

答案 0 :(得分:0)

嗯,最简单的方法是测试它 - 所以我在1个程序集中创建了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"

希望这会有所帮助:)

答案 1 :(得分:0)

所以这是摘录,对吧?

  

Java使用五个显式关键字来设置类中的边界:public,   私有,受保护,内部和受保护的内部。他们的使用和   意思很简单。这些访问说明符决定了谁   可以使用以下定义。公众意味着以下   每个人都可以使用定义。私有关键字,另一方面   手,意味着没有人可以访问这些定义,除了你,   类型的创建者,该类型的内部成员函数。私人是一个   你和客户程序员之间的砖墙。如果有人试图   访问私有成员,他们会得到一个编译时错误。保护   行为就像私有一样,但继承类有权访问   受保护的成员,但不是私人成员。继承将是   很快介绍。内部通常被称为“友好” - 定义可以   可以被同一名称空间中的其他类访问,就像它是公共的一样,   但不能访问不同命名空间中的类。命名空间会   在#ref#[sic]一章中深入讨论。受保护的内部允许   在同一名称空间(与内部)或通过类访问   继承类(与protected一样),即使是继承类也是如此   不在同一名称空间内。

     

C#的默认访问权限,如果您不使用其中一个,则会发挥作用   上述说明符,是内部的

作者可能将Java internal与c#internal混为一谈。

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

在c#中,命名空间与可访问性修饰符完全没有关系。除非您使用InternalsVisibleTo属性,否则只有同一程序集中的类才能访问internal类型或成员。命名空间并不重要。