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 有三种主要用法:
- 引用命名空间:
using System;,在文件顶部引入命名空间。 - 创建别名:
using U = MySpace.UserInfo;,为类型创建短别名。 - 自动释放资源:
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(); // 编译错误
}
}
参考答案:
问题在于 MySpace1 和 MySpace2 中都包含 UserInfo 类,编译器无法确定具体使用哪一个,产生二义性。修改方案:
- 方案一:使用完全限定名
MySpace1.UserInfo user = new MySpace1.UserInfo(); - 方案二:使用别名
using U = MySpace1.UserInfo; - 方案三:移除其中一个
using引用。
六、总结
- 命名空间是逻辑容器,用于组织类、避免命名冲突。
- 使用
namespace定义,使用using引用。 - 不同命名空间下可以有同名类,同一命名空间下类名必须唯一。
- 访问类的方式包括完全限定名和
using引用。 - 遇到命名冲突时,使用完全限定名或别名消除歧义。
- 命名空间可以嵌套,也可使用点号简写。
- 注意区分命名空间(逻辑)与程序集(物理)的概念。
实际开发中,建议按照 公司名.项目名.模块名 的方式命名命名空间,例如 Zhaoxi.ConsoleApp.ClassCourse,既能避免冲突,又能清晰反映代码结构。

浙公网安备 33010602011771号