# 命名空间 概念: 命名空间使用 `namespace` 关键字定义 作用是:==组织代码,避免类型名字冲突== 简单理解: 命名空间就像文件夹 同名文件放在不同文件夹里不会冲突 同名类放在不同命名空间里也不会冲突 通常用法: 1. 按功能或模块组织代码 2. 避免不同类库之间出现同名类型冲突 3. 让大型项目结构更清楚 4. 配合 `using` 简化类型书写 ---- # 语法 传统写法: ```csharp namespace 命名空间名 { class 类名 { } } ``` 案例: ```csharp namespace Game.Character { class Player { } } ``` 文件范围命名空间写法: ```csharp namespace Game.Character; class Player { } ``` 这种写法表示: 当前文件中的类型都属于 `Game.Character` 命名空间 初学阶段先掌握传统大括号写法即可。 ---- # using 的作用 如果类型在某个命名空间中,使用前可以写完整名称。 ```csharp System.Console.WriteLine("Hello"); ``` 也可以先写 `using`: ```csharp using System; Console.WriteLine("Hello"); ``` 理解: `using System;` 表示引入 `System` 命名空间 这样就不用每次都写 `System.Console` ---- # 避免同名冲突 ```csharp namespace Game { class Player { } } namespace Tool { class Player { } } ``` 这两个 `Player` 不冲突,因为它们在不同命名空间中。 使用完整名称: ```csharp Game.Player p1 = new Game.Player(); Tool.Player p2 = new Tool.Player(); ``` 如果只写: ```csharp Player p = new Player(); ``` 编译器可能不知道你要用哪个 `Player`。 ---- # 命名空间可以分开写 同一个命名空间可以分布在多个文件中。 文件1: ```csharp namespace Game { class Player { } } ``` 文件2: ```csharp namespace Game { class Enemy { } } ``` 理解: 这两个类型都属于 `Game` 命名空间 命名空间不是文件夹本身,而是代码里的逻辑组织方式 ---- # 命名空间可以嵌套 ```csharp namespace Game { namespace Character { class Player { } } } ``` 更常见的写法: ```csharp namespace Game.Character { class Player { } } ``` 两种写法都表示: `Player` 属于 `Game.Character` ---- # 命名空间和访问修饰符 命名空间只是组织代码,不代表访问权限。 ```csharp namespace Game { public class Player { } } ``` `public`、`private`、`internal` 这些才是控制访问权限的关键。 注意: 1. 顶级类一般不能直接写 `private` 2. 顶级类不写访问修饰符时,默认通常是 `internal` 3. 命名空间不负责决定谁能访问谁 ---- # using 别名 如果两个命名空间中有同名类,可以用别名简化。 ```csharp using GamePlayer = Game.Player; using ToolPlayer = Tool.Player; GamePlayer p1 = new GamePlayer(); ToolPlayer p2 = new ToolPlayer(); ``` 这个写法不常用,但遇到同名类型冲突时很有用。 ---- # 常见错误 错误1:以为文件夹名就是命名空间 实际: 文件夹名和命名空间名可以一致,但不是同一个东西 真正决定命名空间的是代码里的 `namespace` ---- 错误2:忘记写 `using` ```csharp Console.WriteLine("Hello"); ``` 如果没有引入 `System`,可能找不到 `Console`。 解决: ```csharp using System; ``` 或者: ```csharp System.Console.WriteLine("Hello"); ``` ---- 错误3:同名类型不知道用哪个 ```csharp using Game; using Tool; Player p = new Player(); ``` 如果 `Game` 和 `Tool` 里都有 `Player`,这里可能会冲突。 解决: ```csharp 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)](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/namespace) 2. Microsoft Learn: [using directive (C# Reference)](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-directive) #命名空间 #核心