我目前正在线阅读本书: 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文档中意味着可以跨不同的命名空间访问内部类吗?
或者说内部类在其受尊重的程序集和名称空间中都是私有的吗?
答案 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
类型或成员。命名空间并不重要。