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.Linq
4、提高代码可读性
例如:
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);
更方便。
十、命名空间别名
如果两个命名空间中都有 Student:
using School;
using Company;
会报错:
Student 不明确
解决办法:
using Stu1 = School.Student;
using Stu2 = Company.Student;
然后:
Stu1 s1 = new Stu1();
Stu2 s2 = new Stu2();
十一、global using(C# 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) |
| 命名规范 | 推荐使用 公司名.产品名.模块名 |
更多推荐



所有评论(0)