假设namespace A2嵌套在namespace A1中,那么A2是封闭A1的成员。但是A2的成员(因此在A2中声明的类型)不是A1的成员。
( a) A2成员不是A1成员的确切含义是什么?换句话说,如果他们也是A1的成员,会有什么不同呢?也许在A1中,我们不必为在A2中定义的类型使用完全限定的名称?
( b)名称空间A2作为A1成员的确切含义是什么?
顺便说一句,我确实理解名称空间,我只是对我的书中使用的术语感到困惑(即,A2是成员, of A1等等)
萨克斯
编辑
1)因此,从本质上说,A2是A1的成员之一,所以在引用在A2中声明的类型时,在A1内部我们不必指定A1. prefix
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中定义了以下内容
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.B.B1实例时,我们需要指定该类型的完全限定名。但是使用App1,我们可以通过B.B1指定类型。因此,为什么允许我们在App1中省略App1前缀,而不允许在App2中省略它( App2有一个using A;指令,因此它的行为应该与App1的行为相同)?
另外,如果namespace B是namespace A的成员,那么App2不应该允许我们使用B.B1 instanceB1 = new B.B1();语法声明一个A.B.B1类型吗?!
发布于 2010-07-17 19:33:49
考虑以下几点
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中,代码位于命名空间内。
在这里,“成员”这个词可能有点混乱。
发布于 2010-07-17 19:28:35
A2的成员是A2的成员--“责任到此为止”。如果A1包含A2成员的定义,那么没有什么变化--无论以哪种方式将这些成员引用为A1成员,将A2成员引用为A1.A2成员--除非您有using语句,在这种情况下,如果希望避免编译器错误,则需要小心处理。
发布于 2010-07-17 19:46:09
C#规范第3.4节涵盖了成员的含义:
成员 名称空间和类型有成员。一个实体的成员通常可以通过使用限定名来获得,该限定名的开头是对该实体的引用,后面是“”。令牌,后面跟着成员的名称。 类型的成员要么在类型声明中声明,要么从类型的基类继承。..。
“命名空间成员”的定义载于第3.4.1节:
名称空间成员 ..。 命名空间和命名空间中声明的类型是该命名空间的成员。
这意味着,仅仅因为A1.A2.Foo工作,并不意味着A1.Foo也能工作。
https://stackoverflow.com/questions/3272913
复制相似问题