C# 命名空间详解
命名空间Namespace是 C# 中用于组织代码、避免命名冲突、提高代码可维护性的重要机制。可以把它理解为计算机中的文件夹而类、接口、结构体等就是文件夹里的文件。一、什么是命名空间现实生活中有很多重名的人例如张三销售部 张三技术部如果没有部门就不知道是谁。同样在程序中也可能出现多个同名类。例如class Student { }另一个项目也有class Student { }如果放在同一个程序中就会发生冲突。因此需要命名空间来区分。例如namespace School { class Student { } } namespace Company { class Student { } }这样就是两个完全不同的类。调用时School.Student stu1 new School.Student(); Company.Student stu2 new Company.Student();二、命名空间的作用主要有四个作用1、避免类名冲突最重要例如System.IO.File和MyProject.File虽然都叫 File但属于不同命名空间。2、组织代码大型项目通常有很多模块项目 ├── User │ User.cs │ Login.cs │ ├── Product │ Product.cs │ Order.cs │ ├── Common │ Helper.cs │ Config.cs对应命名空间namespace MyProject.User { } namespace MyProject.Product { } namespace MyProject.Common { }结构十分清晰。3、方便管理大型项目几十万个类不可能全部放在一起。微软.NET源码就是这样组织的System System.IO System.Net System.Text System.Collections System.Threading System.Linq4、提高代码可读性例如MyCompany.HR.Employee MyCompany.Sales.Employee一眼就知道属于哪个模块。三、命名空间语法最基本写法namespace MyProject { class Program { } class Student { } }多个类可以放在一个命名空间里。四、命名空间可以嵌套例如namespace MyProject { namespace Models { class Student { } } }等价于namespace MyProject.Models { class Student { } }推荐第二种更简洁。五、访问命名空间中的类例如namespace School { class Student { public void Study() { Console.WriteLine(学习); } } }调用School.Student stu new School.Student(); stu.Study();输出学习六、using 导入命名空间如果每次都写School.Student stu new School.Student(); School.Teacher teacher new School.Teacher(); School.ClassRoom room new School.ClassRoom();会很麻烦。可以使用using School;之后Student stu new Student(); Teacher teacher new Teacher(); ClassRoom room new ClassRoom();代码更简洁。七、using 的位置通常写在文件最前面using System; using System.Text; using School; namespace Demo { }八、多个 using可以同时导入多个命名空间using System; using System.IO; using System.Text; using System.Collections.Generic;九、using static静态导入C# 6.0 开始支持例如using static System.Math;以前double r Math.Sqrt(25); double x Math.Pow(2, 3);现在double r Sqrt(25); double x Pow(2, 3);更方便。十、命名空间别名如果两个命名空间中都有 Studentusing School; using Company;会报错Student 不明确解决办法using Stu1 School.Student; using Stu2 Company.Student;然后Stu1 s1 new Stu1(); Stu2 s2 new Stu2();十一、global usingC# 10以前每个文件using System; using System.Text; using System.Collections.Generic;都要写。现在global using System; global using System.Text; global using System.Collections.Generic;整个项目都能使用。适用于公共库ASP.NET Core大型项目十二、文件作用域命名空间C# 10传统写法namespace Demo { class Student { } }新写法namespace Demo; class Student { }优点少一层缩进更简洁官方推荐十三、实际项目目录示例MyProject │ ├── Models │ Student.cs │ Teacher.cs │ ├── Services │ StudentService.cs │ ├── Controllers │ StudentController.cs │ ├── Common │ Logger.cs │ └── Program.cs对应命名空间MyProject.Models MyProject.Services MyProject.Controllers MyProject.Common十四、命名规范微软官方建议命名空间采用公司名.产品名.模块名例如Microsoft.AspNetCore.Mvc Microsoft.Extensions.Logging System.Collections.Generic企业开发常见ABCERP.Models ABCERP.Service ABCERP.DAL ABCERP.Common ABCERP.Utils不要使用namespace test { }建议namespace MyCompany.OrderSystem.Models { }十五、综合案例using System; namespace School.Models { class Student { public string Name { get; set; } public void Show() { Console.WriteLine($姓名{Name}); } } } namespace School { class Program { static void Main() { Models.Student stu new Models.Student(); stu.Name 张三; stu.Show(); } } }运行结果姓名张三十六、总结知识点说明Namespace用于组织代码、避免命名冲突using导入命名空间简化类名书写using static导入静态成员可直接调用静态方法别名using 解决同名类型冲突global using全项目共享导入C# 10文件作用域命名空间namespace Demo;减少缩进C# 10命名规范推荐使用公司名.产品名.模块名