C# 命名空间学习笔记

一、命名空间的概念

在 C# 中,命名空间(Namespace)可以理解为一个逻辑范围,用来标注其中成员的归属。它主要解决两个问题:

  • 不同命名空间中可以存在同名的类,互不冲突。
  • 同一命名空间内,类名必须唯一

命名空间的好处包括:

  • 避免命名冲突
  • 便于按模块组织和管理类
  • 提高代码可读性和可维护性
  • 方便团队协作,各模块独立开发

通俗类比:命名空间就像操作系统中的文件夹,不同文件夹下可以有同名文件。

二、定义命名空间

使用 namespace 关键字定义命名空间,语法如下:

namespace 命名空间名
{
    // 类及类中的成员
}

示例:不同命名空间下的同名类

namespace MySpace1
{
    public class UserInfo
    {
        public void Show()
        {
            Console.WriteLine("编号:01,姓名:李明");
        }
    }
}

namespace MySpace2
{
    public class UserInfo
    {
        public void Show()
        {
            Console.WriteLine("编号:02,姓名:王林");
        }
    }
}

如果需要在同一个程序中使用这两个类,必须使用完全限定名(命名空间名.类名)来区分:

namespace Zhaoxi.ConsoleApp.ClassCourse
{
    class Program
    {
        static void Main(string[] args)
        {
            MySpace1.UserInfo user01 = new MySpace1.UserInfo();
            user01.Show();   // 输出:编号:01,姓名:李明

            MySpace2.UserInfo user02 = new MySpace2.UserInfo();
            user02.Show();   // 输出:编号:02,姓名:王林
        }
    }
}

三、引用命名空间

使用 using 关键字可以引用指定的命名空间,告诉编译器后续代码会用到该命名空间。引用后,可以直接使用类名而无需书写完整的命名空间路径。

using System;
using MySpace2;

namespace Zhaoxi.ConsoleApp.ClassCourse
{
    class Program
    {
        static void Main(string[] args)
        {
            // MySpace1 未引用,必须使用完全限定名
            MySpace1.UserInfo user01 = new MySpace1.UserInfo();
            user01.Show();

            // MySpace2 已引用,可直接使用类名
            UserInfo user02 = new UserInfo();
            user02.Show();
        }
    }
}

注意事项

如果同时 using 了两个包含同名类的命名空间,编译器将无法判断使用哪一个类,此时必须使用完全限定名或 using 别名来消除歧义。

四、命名空间的其他特性

1. 嵌套命名空间

命名空间可以嵌套定义,可以使用点号简写:

namespace Company
{
    namespace Department
    {
        public class Employee { }
    }
}

// 等价写法:
namespace Company.Department
{
    public class Employee { }
}

访问嵌套命名空间中的类需要使用完整路径,例如 Company.Department.Employee

2. using 别名

using 除了引用命名空间,还可以为类型创建别名,适合类名较长或需要区分同名类的情况:

using U1 = MySpace1.UserInfo;
using U2 = MySpace2.UserInfo;

U1 user01 = new U1();   // 等价于 MySpace1.UserInfo
U2 user02 = new U2();   // 等价于 MySpace2.UserInfo

五、面试题精选

问题 1:什么是命名空间?它解决了什么问题?

参考答案:

命名空间是 C# 中用于组织和管理类的逻辑容器。它主要解决以下问题:

  • 命名冲突:不同命名空间下可以有同名类,避免大型项目中的类名冲突。
  • 代码组织:按照功能模块划分命名空间,使项目结构更清晰。
  • 便于维护:通过命名空间可以快速定位类所在模块,提高开发效率。

问题 2:using 关键字有哪几种用法?

参考答案:

C# 中 using 有三种主要用法:

  1. 引用命名空间using System;,在文件顶部引入命名空间。
  2. 创建别名using U = MySpace.UserInfo;,为类型创建短别名。
  3. 自动释放资源using (var stream = new FileStream(...)) { },确保实现 IDisposable 接口的对象在使用完毕后自动释放。

问题 3:同时 using 两个包含同名类的命名空间会发生什么?如何解决?

参考答案:

如果两个被引用的命名空间中存在同名类,在代码中使用简单类名时,编译器会报错(CS0104:不明确的引用)。解决方案:

  • 使用完全限定名MySpace1.UserInfo u1 = new MySpace1.UserInfo();
  • 使用别名using U1 = MySpace1.UserInfo;
  • 移除其中一个 using 引用。

问题 4:命名空间与程序集(Assembly)有什么区别?

参考答案:

  • 命名空间是逻辑上的组织单元,用于解决命名冲突,是编译时的概念。
  • 程序集是物理上的组织单元(如 .dll 或 .exe 文件),是部署和版本控制的基本单位,是运行时的概念。
  • 一个程序集可以包含多个命名空间;一个命名空间也可以跨越多个程序集。

问题 5:以下代码存在什么问题?如何修改?

using System;
using MySpace1;
using MySpace2;

class Program
{
    static void Main()
    {
        UserInfo user = new UserInfo();   // 编译错误
    }
}

参考答案:

问题在于 MySpace1MySpace2 中都包含 UserInfo 类,编译器无法确定具体使用哪一个,产生二义性。修改方案:

  • 方案一:使用完全限定名 MySpace1.UserInfo user = new MySpace1.UserInfo();
  • 方案二:使用别名 using U = MySpace1.UserInfo;
  • 方案三:移除其中一个 using 引用。

六、总结

  • 命名空间是逻辑容器,用于组织类、避免命名冲突。
  • 使用 namespace 定义,使用 using 引用。
  • 不同命名空间下可以有同名类,同一命名空间下类名必须唯一。
  • 访问类的方式包括完全限定名和 using 引用。
  • 遇到命名冲突时,使用完全限定名或别名消除歧义。
  • 命名空间可以嵌套,也可使用点号简写。
  • 注意区分命名空间(逻辑)与程序集(物理)的概念。

实际开发中,建议按照 公司名.项目名.模块名 的方式命名命名空间,例如 Zhaoxi.ConsoleApp.ClassCourse,既能避免冲突,又能清晰反映代码结构。

posted @ 2026-08-15 13:53  春煦景明  阅读(3)  评论(0)    收藏  举报