Files
My-Notes/笔记/CSharp/核心/命名空间.md
T
2026-06-21 09:51:55 +08:00

5.1 KiB
Raw Blame History

命名空间

概念: 命名空间使用 namespace 关键字定义 作用是:==组织代码,避免类型名字冲突==

简单理解: 命名空间就像文件夹 同名文件放在不同文件夹里不会冲突 同名类放在不同命名空间里也不会冲突

通常用法:

  1. 按功能或模块组织代码
  2. 避免不同类库之间出现同名类型冲突
  3. 让大型项目结构更清楚
  4. 配合 using 简化类型书写

语法

传统写法:

namespace 命名空间名
{
	class 类名
	{

	}
}

案例:

namespace Game.Character
{
	class Player
	{

	}
}

文件范围命名空间写法:

namespace Game.Character;

class Player
{

}

这种写法表示: 当前文件中的类型都属于 Game.Character 命名空间

初学阶段先掌握传统大括号写法即可。


using 的作用

如果类型在某个命名空间中,使用前可以写完整名称。

System.Console.WriteLine("Hello");

也可以先写 using

using System;

Console.WriteLine("Hello");

理解: using System; 表示引入 System 命名空间 这样就不用每次都写 System.Console


避免同名冲突

namespace Game
{
	class Player
	{
	}
}

namespace Tool
{
	class Player
	{
	}
}

这两个 Player 不冲突,因为它们在不同命名空间中。

使用完整名称:

Game.Player p1 = new Game.Player();
Tool.Player p2 = new Tool.Player();

如果只写:

Player p = new Player();

编译器可能不知道你要用哪个 Player


命名空间可以分开写

同一个命名空间可以分布在多个文件中。

文件1

namespace Game
{
	class Player
	{
	}
}

文件2

namespace Game
{
	class Enemy
	{
	}
}

理解: 这两个类型都属于 Game 命名空间 命名空间不是文件夹本身,而是代码里的逻辑组织方式


命名空间可以嵌套

namespace Game
{
	namespace Character
	{
		class Player
		{
		}
	}
}

更常见的写法:

namespace Game.Character
{
	class Player
	{
	}
}

两种写法都表示: Player 属于 Game.Character


命名空间和访问修饰符

命名空间只是组织代码,不代表访问权限。

namespace Game
{
	public class Player
	{
	}
}

publicprivateinternal 这些才是控制访问权限的关键。

注意:

  1. 顶级类一般不能直接写 private
  2. 顶级类不写访问修饰符时,默认通常是 internal
  3. 命名空间不负责决定谁能访问谁

using 别名

如果两个命名空间中有同名类,可以用别名简化。

using GamePlayer = Game.Player;
using ToolPlayer = Tool.Player;

GamePlayer p1 = new GamePlayer();
ToolPlayer p2 = new ToolPlayer();

这个写法不常用,但遇到同名类型冲突时很有用。


常见错误

错误1:以为文件夹名就是命名空间

实际: 文件夹名和命名空间名可以一致,但不是同一个东西 真正决定命名空间的是代码里的 namespace


错误2:忘记写 using

Console.WriteLine("Hello");

如果没有引入 System,可能找不到 Console

解决:

using System;

或者:

System.Console.WriteLine("Hello");

错误3:同名类型不知道用哪个

using Game;
using Tool;

Player p = new Player();

如果 GameTool 里都有 Player,这里可能会冲突。

解决:

Game.Player p = new Game.Player();

什么时候需要命名空间

小练习: 可以不太关注命名空间,直接写类也能运行

项目变大后:

  1. 不同模块类越来越多
  2. 第三方库越来越多
  3. 同名类型冲突概率增加
  4. 需要清晰分层和组织

这时就应该认真使用命名空间。


注意

  1. namespace 用来组织代码和避免命名冲突
  2. using 用来引入命名空间,简化类型名称
  3. 不同命名空间里可以有同名类型
  4. 使用完整类型名可以解决同名冲突
  5. 命名空间可以跨多个文件
  6. 命名空间可以嵌套,常用点号表示层级
  7. 命名空间不是访问权限控制工具
  8. 文件夹结构和命名空间通常保持一致,但语法上不是一回事

一句话记忆

==namespace 负责给类型分组,using 负责把分组引进来方便使用。==

再压缩一点: ==命名空间像文件夹,用来防止重名。==


面试/复习时怎么说

可以这样答:

“命名空间是用 namespace 定义的代码组织方式,主要作用是给类型分组并避免命名冲突。
使用类型时可以写完整命名空间,也可以通过 using 引入命名空间来简化书写。
命名空间可以跨多个文件,也可以嵌套,但它本身不控制访问权限。”


引用:

  1. Microsoft Learn: namespace (C# Reference)
  2. Microsoft Learn: using directive (C# Reference)

#命名空间 #核心