C# namespace:命名空间

C# 中,可以将命名空间看作是一个范围,用来标注命名空间中成员的归属,一个命名空间中类与另一个命名空间中同名的类互不冲突,但在同一个命名空间中类的名称必须是唯一的。

举个简单的例子,在一个简单的 C# 程序中,假如我们要输出某些数据,就需要使用 System.Console.WriteLine() ,其中 System 就是命名空间,而 Console 是类的名字,WriteLine 则是具体要使用方法。也就是说,如果要访问某个命名空间中的类,我们需要使用 namespacename.classname.funcname()的形式。当然也可以使用 using 关键字来引用需要的命名空间,例如 using System,这样我们就可以直接使用 Console.WriteLine() 来输出指定的数据了。

命名空间的结构类似于我们计算机系统中的目录,我们可以将某个目录看作是一个命名空间,在这个目录下可以存在若干不同的文件夹,这些文件夹就可以看作是命名空间下的类。而在每个文件夹下又存放着一些文件或文件夹,这些文件和文件夹则可以看作是类中的成员。

使用命名空间的好处是可以避免命名冲突,同时也便于查找类的位置。

定义命名空间

在 C# 中定义命名空间需要使用 namespace 关键字,语法格式如下:

namespace namespaceName{
    // 命名空间中的代码
}

若要调用指定命名空间下的成员,则需要使用 namespaceName.className.funcName()的形式,下面通过一个示例来演示命名空间的使用:
namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args) 
        {
            First.demoClass demo1 = new First.demoClass();
            Second.demoClass demo2 = new Second.demoClass();
            demo1.sayHello();
            demo2.sayHello();
        }
    }
}

namespace First{
    public class demoClass{
        public void sayHello(){
            System.Console.WriteLine("First 命名空间下 demoClass 类中的 sayHello 函数");
        }
    }
}

namespace Second{
    public class demoClass{
        public void sayHello(){
            System.Console.WriteLine("Second 命名空间下 demoClass 类中的 sayHello 函数");
        }
    }
}
运行结果如下:

First 命名空间下 demoClass 类中的 sayHello 函数
Second 命名空间下 demoClass 类中的 sayHello 函数

using关键字

using 关键字用来引用指定的命名空间,它可以告诉编译器后面的代码中我们需要用到某个命名空间。例如我们在程序中需要使用到 System 命名空间,只需要在程序的开始使用 using System 引用该命名空间即可,这时我们在使用 System 命名空间下的类时就可以将 System. 省略,例如 Console.WriteLine();。下面通过一个示例演示一下:
using System;
using First;
using Second;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args) 
        {
            firstClass first = new firstClass();
            secondClass second = new secondClass();
            first.sayHello();
            second.sayHello();
        }
    }
}

namespace First{
    public class firstClass{
        public void sayHello(){
            System.Console.WriteLine("First 命名空间下 demoClass 类中的 sayHello 函数");
        }
    }
}

namespace Second{
    public class secondClass{
        public void sayHello(){
            System.Console.WriteLine("Second 命名空间下 demoClass 类中的 sayHello 函数");
        }
    }
}
运行结果如下:

First 命名空间下 demoClass 类中的 sayHello 函数
Second 命名空间下 demoClass 类中的 sayHello 函数

命名空间嵌套

命名空间可以嵌套使用,也就是说我们可以在一个命名空间中再定义一个或几个命名空间,如下所示:

namespace namespaceName1{
    // namespaceName1 下的代码
    namespace namespaceName2{
        // namespaceName2 下的代码
    }
}

您可以使用点.运算符来访问嵌套的命名空间成员,例如 namespaceName1.namespaceName2。下面通过示例来演示一下命名空间的嵌套使用:
using System;
using First;
using First.Second;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args) 
        {
            firstClass first = new firstClass();
            secondClass second = new secondClass();
            first.sayHello();
            second.sayHello();
        }
    }
}

namespace First{
    public class firstClass{
        public void sayHello(){
            System.Console.WriteLine("First 命名空间下 demoClass 类中的 sayHello 函数");
        }
    }
    namespace Second{
        public class secondClass{
            public void sayHello(){
                System.Console.WriteLine("Second 命名空间下 demoClass 类中的 sayHello 函数");
            }
        }
    }
}
运行结果如下:

First 命名空间下 demoClass 类中的 sayHello 函数
Second 命名空间下 demoClass 类中的 sayHello 函数