假设namespace A2
嵌套在namespace A1
中,则A2
是封闭A1
的成员。但A2
的成员(因此在A2
内声明的类型)不是A1
的成员。
a)A2
的成员究竟是什么意思不是A1
的成员?换句话说,如果他们也是A1
的成员,会有什么不同?也许在A1
内,我们不必对A2
中定义的类型使用完全限定名称?
b)名称空间A2
是A1
的成员究竟是什么意思?
感谢名单
修改
1)所以基本上A2
是A1
的成员是内部A1
内部A1. prefix
引用A2
时引用类型的原因namespace A1
{
class Program
{
static void Main(string[] args)
{
A2.classA2 a2= A2.classA2(); //here we don't need to include A1.
prefix
}
}
namespace A2
{
class classA2 { }
}
}
1}}:
assembly asmLibrary.dll
2)以下内容在namespace A
{
public class A1{}
namespace B
{
public class B1{}
}
}
App1
以下应用asmLibrary.dll
也引用了汇编namespace A
{
class Program
{
static void Main(string[] args)
{
B.B1 instanceB1 = new B.B1();
}
}
}
:
App2
以下应用asmLibrary.dll
引用了汇编using A;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
A.B.B1 bInstance = new A.B.B1();
A1 a1 = new A1();
}
}
}
:
App2
a)当我们尝试在A.B.B1
中声明App1
的实例时,我们需要指定该类型的完全限定名称。但是B.B1
我们可以通过A.
指定类型。因此,为什么我们允许在App1
内省略App2
前缀,而不在App2
内省略using A;
App1
指令,因此其行为应相同到namespace B
)的那个?
b)另外,如果namespace A
是App2
的成员,则不应A.B.B1
允许我们使用B.B1 instanceB1 = new B.B1();
语法声明类型{{1}} ?!
答案 0 :(得分:3)
考虑以下
namespace A1
{
namespace A2 // A1.A2
{
class C2 // full name: A1.A2.C2
{
private A1.C1 c1b; // full name
private C1 c1b; // shortest form. A1 is in scope here
}
}
class C1 // full name: A1.C1
{
private A1.A2.C2 c2a; // full name
private A2.C2 c2b; // shortest form. We can omit the A1 prefix but not A2
}
}
答案
a)C2类不是A1的(直接)成员,因此在A2命名空间之外我们必须声明
它为A2.C2 c2b;
b)A1的成员在A2范围内,见C1 c1b;
重新编辑:
您的示例显示了using a; ...
和namespace A { ... }
的不同效果。
using语句'从A (§ 16.3.2)'导入 类型 ,而在App2中,代码是在命名空间内。<登记/> “会员”一词在这里可能有点令人困惑。
答案 1 :(得分:1)
A2的成员是A2的成员 - “巴克停在那里”。如果A1包含A2成员的定义,那么没有任何变化 - 无论你需要将这些成员称为A1.member和A2的成员作为A1.A2.member - 除非你有using
陈述如果你想避免编译错误,你需要谨慎行事。
答案 2 :(得分:1)
成员的含义包含在C#规范的第3.4节中:
<强>成员强>
命名空间和类型具有成员。实体的成员通常可以通过使用以对实体的引用开头的限定名称,然后是“。”标记,后跟成员的名称来获得。
类型的成员要么在类型声明中声明,要么从类型的基类继承。 [...]
“命名空间成员”的定义见第3.4.1节:
命名空间成员
[...]
命名空间内声明的命名空间和类型是该命名空间的成员。
这意味着仅仅因为A1.A2.Foo
有效,并不意味着A1.Foo
也有效。
答案 3 :(得分:1)
据我了解,IL没有名称空间的概念。编译器附加命名空间名称和类型名称以组成更长的全名;例如,命名空间Customer
中的类MyCompany.MyProduct
在编译为IL时将呈现为MyCompany$MyProduct$Customer
之类的内容。对于IL虚拟机,这是一个类型名称;它包含$
符号这一事实无关紧要。
从这个事实你可以得出你自己的结论。 : - )