首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套命名空间的成员

嵌套命名空间的成员
EN

Stack Overflow用户
提问于 2010-07-17 19:18:25
回答 4查看 456关注 0票数 3

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

( a) A2成员不是A1成员的确切含义是什么?换句话说,如果他们也是A1的成员,会有什么不同呢?也许在A1中,我们不必为在A2中定义的类型使用完全限定的名称?

( b)名称空间A2作为A1成员的确切含义是什么?

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

萨克斯

编辑

1)因此,从本质上说,A2A1的成员之一,所以在引用在A2中声明的类型时,在A1内部我们不必指定A1. prefix

代码语言:javascript
复制
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 { }
    }
}

2)在assembly asmLibrary.dll中定义了以下内容

代码语言:javascript
复制
namespace A
{
    public class A1{}


    namespace B
    {
        public class B1{}
    }
}

下面的应用程序App1还引用了程序集asmLibrary.dll

代码语言:javascript
复制
namespace A
{
    class Program
    {
        static void Main(string[] args)
        {
            B.B1 instanceB1 = new B.B1();
        }
    }
}

下面的应用程序App2引用程序集asmLibrary.dll

代码语言:javascript
复制
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.B.B1实例时,我们需要指定该类型的完全限定名。但是使用App1,我们可以通过B.B1指定类型。因此,为什么允许我们在App1中省略App1前缀,而不允许在App2中省略它( App2有一个using A;指令,因此它的行为应该与App1的行为相同)?

另外,如果namespace Bnamespace A的成员,那么App2不应该允许我们使用B.B1 instanceB1 = new B.B1();语法声明一个A.B.B1类型吗?!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-17 19:33:49

考虑以下几点

代码语言:javascript
复制
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 { ... }的不同效果。

使用语句“从A导入类型”,而在App2中,代码位于命名空间内。

在这里,“成员”这个词可能有点混乱。

票数 3
EN

Stack Overflow用户

发布于 2010-07-17 19:28:35

A2的成员是A2的成员--“责任到此为止”。如果A1包含A2成员的定义,那么没有什么变化--无论以哪种方式将这些成员引用为A1成员,将A2成员引用为A1.A2成员--除非您有using语句,在这种情况下,如果希望避免编译器错误,则需要小心处理。

票数 1
EN

Stack Overflow用户

发布于 2010-07-17 19:46:09

  • 名称空间A2作为A1的成员究竟意味着什么?

C#规范第3.4节涵盖了成员的含义:

成员 名称空间和类型有成员。一个实体的成员通常可以通过使用限定名来获得,该限定名的开头是对该实体的引用,后面是“”。令牌,后面跟着成员的名称。 类型的成员要么在类型声明中声明,要么从类型的基类继承。..。

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

名称空间成员 ..。 命名空间和命名空间中声明的类型是该命名空间的成员。

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

这意味着,仅仅因为A1.A2.Foo工作,并不意味着A1.Foo也能工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3272913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档