嵌套命名空间的成员

时间:2010-07-17 19:18:25

标签: c# namespaces

假设namespace A2嵌套在namespace A1中,则A2是封闭A1的成员。但A2的成员(因此在A2内声明的类型)不是A1的成员。

a)A2的成员究竟是什么意思不是A1的成员?换句话说,如果他们也是A1的成员,会有什么不同?也许在A1内,我们不必对A2中定义的类型使用完全限定名称?

b)名称空间A2A1的成员究竟是什么意思?

BTW - 我确实理解名称空间,我只是对我的书中使用的术语感到困惑(即A2是成员的A1等)

感谢名单

修改

1)所以基本上A2A1的成员是内部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 AApp2的成员,则不应A.B.B1允许我们使用B.B1 instanceB1 = new B.B1();语法声明类型{{1}} ?!

4 个答案:

答案 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)

  • 命名空间A2是A1的成员究竟是什么意思?

成员的含义包含在C#规范的第3.4节中:

  

<强>成员

     

命名空间和类型具有成员。实体的成员通常可以通过使用以对实体的引用开头的限定名称,然后是“。”标记,后跟成员的名称来获得。

     

类型的成员要么在类型声明中声明,要么从类型的基类继承。 [...]

“命名空间成员”的定义见第3.4.1节:

  

命名空间成员

     

[...]

     

命名空间内声明的命名空间和类型是该命名空间的成员。

  • A2的成员究竟是什么意思不是A1的成员?

这意味着仅仅因为A1.A2.Foo有效,并不意味着A1.Foo也有效。

答案 3 :(得分:1)

据我了解,IL没有名称空间的概念。编译器附加命名空间名称和类型名称以组成更长的全名;例如,命名空间Customer中的类MyCompany.MyProduct在编译为IL时将呈现为MyCompany$MyProduct$Customer之类的内容。对于IL虚拟机,这是一个类型名称;它包含$符号这一事实无关紧要。

从这个事实你可以得出你自己的结论。 : - )