c#是否有类似“孩子”的东西。命名空间,或Java中的包范围?

时间:2015-01-31 00:43:02

标签: c# namespaces

我不明白为什么在这种情况下不需要明确的参考:

//SomeStaticClass.cs
namespace WhyDontINeedUsingStatement {

    public static class SomeStaticClass {
        public static string Thingy {
            get { return "Behold! A thingy!"; }
        }
    }

    public class SomeNonStaticClass {
        public void DoSomethingUseful() {
            var foo = 9; 
        }
    }
}

// /SomeNamespace/SomeBoringClass.cs
namespace WhyDontINeedUsingStatement.SomeNamespace {
    public class SomeBoringClass {
        public static void DoSomething() {
            var whatever = SomeStaticClass.Thingy;

            var blah = new SomeNonStaticClass();
            blah.DoSomethingUseful();            
        }
    }
}

为什么这不需要顶部的using WhyDontINeedUsingStatement? Aren这些独立的命名空间,即使它们以相同的东西开头?

我认为C#名称空间与Java软件包完全不同(并且不会影响访问控制),但不是为什么第二类能够引用第一类的东西。

1 个答案:

答案 0 :(得分:1)

根据C#语言规范版本5.0第9.2节,似乎在命名空间声明中使用.是语法糖:

  

namespace-declaration的qualified-identifier可以是单个   标识符或由“。”标记分隔的标识符序列。该   后一种形式允许程序在没有的情况下定义嵌套的命名空间   词法上嵌套几个名称空间声明。例如,

namespace N1.N2
{
    class A {}
    class B {}
}
  

在语义上等同于

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}

因此,从N2内部您可以看到N1,因此您可以使用它。