【问题标题】:Can internal classes be accessed within other namespaces?可以在其他命名空间中访问内部类吗?
【发布时间】:2017-11-27 14:16:37
【问题描述】:
【问题讨论】:
标签:
c#
.net
namespaces
assemblies
【解决方案1】:
所以这是摘录,对吧?
Java 使用五个显式关键字来设置类的边界:public、
私有的、受保护的、内部的和受保护的内部的。它们的使用和
意思很简单。这些访问说明符确定谁
可以使用下面的定义。公开的意思如下
每个人都可以使用定义。另一方面,private 关键字
手,意味着除了你之外没有人可以访问这些定义,
类型的创建者,在该类型的成员函数内部。私人是一个
你和客户程序员之间的砖墙。如果有人试图
访问一个私有成员,他们会得到一个编译时错误。受保护
像私有的一样,除了继承类可以访问
受保护的成员,但不是私有成员。继承会
不久介绍。内部通常被称为“友好的”——定义可以
被同一命名空间中的其他类访问,就好像它是公共的一样,
但不同命名空间中的类无法访问。命名空间将
将在#ref# [原文如此] 章中深入讨论。受保护的内部允许
通过同一命名空间中的类(如内部)或通过
继承类(与受保护的一样),即使继承类是
不在同一个命名空间内。
C# 的默认访问权限,如果您不使用其中一种
上述说明符,是内部的
作者可能将Java 的internal 与c# 的internal 混为一谈。
它们略有不同,因为 Java 没有程序集;它有包,将类组织到命名空间中。
在 c# 中,命名空间与可访问性修饰符绝对没有关系。只有同一程序集中的类才能访问internal 类型或成员,除非您使用InternalsVisibleTo 属性。命名空间无关紧要。
【解决方案2】:
嗯,回答这个问题的最简单方法是测试它——
所以我在 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"
希望这会有所帮助:)