命名空间概述
在C#编程语言中,使用名称空间来组织、管理有相关性的一组或者一类代码,不同命名空间中的成员相互隔离,以避免在不同命名空间中声明相同类名发生冲突。其可访问性由命名空间中的类及类的成员的访问修饰符所决定。
命名空间定义
C#编程语言中,命名空间与类的声明相似,命名空间使用关键字namespace
来声明,语法如下:
namespace YourNameSpaceName
{
// ...
}
其中的YourNameSpaceName
是命名空间的名称,可以是任意的符合命名空间规范的字符,大括号内部放此命名空间的成员。一个命名空间可被定义多次,但同一命名空间的成员不能被重复定义。示例如下:
/*
* 声明一个名为订单系统(OrderSystem)的命名空间
* 此命名空间主要用于存储订单相关的代码
* 比如:订单类,购物车类,支付类等等
*/
namespace OrderSystem
{
public class Order
{
public int Id { get; set; }
}
}
namespace OrderSystem
{
public class ShoppingCart
{
public int Id { get; set; }
}
}
namespace OrderSystem
{
public class Payment
{
public int Id { get; set; }
}
}
上以示例代码片段声明了一个名为订单系统(OrderSystem)的命名空间,此命名空间主要用于存储订单相关的代码,比如:订单类,购物车类,支付类等等。
命名空间的起名一般是根据具体项目来定义的,常规格式为:公司名.项目名.模块名
,比如你将为阿里公司开发一个订单系统的购物模块,那这个命名空间可能为:Ali.OrderSystem.Shopping
,示例代码如下:
/// <summary>
/// 阿里公司开发一个订单系统购物模块的命名空间命名规则
/// </summary>
namespace Ali.OrderSystem.Shopping
{
public class Order
{
public int Id { get; set; }
}
public class ShoppingCart
{
public int Id { get; set; }
}
public class Payment
{
public int Id { get; set; }
}
// ... 其他的类
}
访问命名空间中的类的语法为:
命名空间.类名
注意:
命名空间
与类名
之间的(.)不能省略。
访问命名空间中的类静态成员的语法为:
命名空间.类名.静态成员名
那么,如果要实例化一个订单对象,则可以像如下这样操作:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Ali.OrderSystem.Shopping.Order order = new Ali.OrderSystem.Shopping.Order();
}
}
}
.NET内置的类中,也同样使用了命名空间来组织它的诸多类,如下所示:
System.Console.WriteLine("Hello World!");
这是一条在C#语言开发中经常被用到的向控制台输出信息的语句,其中的System是命名空间,而Console则是位于其中的一个类。
using关键字
在C#编程语言中,除了在语句中键入完整的命名空间外,还可以使用using
关键字来引入需要的命名空间。比如上例中,用到了System
命名空间,则可将如下语句改写成以下两语句:
using System;
Console.WriteLine("Hello World!");
使用using
关键字引用命名空间的好处是,只要处于这个文件中的类,都可省略命名空间而直接访问其中的成员,如下为未使用using
关键字的代码片段:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello World!");
System.Console.WriteLine("Hello Rector");
System.Console.WriteLine("This is a csharp course.");
// 等待用户按键
System.Console.ReadKey();
}
}
public class Student
{
public void SayHello()
{
System.Console.WriteLine("Hi, Rector!");
System.Console.WriteLine("Welcome back to school!");
}
}
}
以上示例代码中多处使用了System
这个命名空间,那可以考虑使用using
关键字引入System
这个命名空间,如下:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.WriteLine("Hello Rector");
Console.WriteLine("This is a csharp course.");
// 等待用户按键
Console.ReadKey();
}
}
public class Student
{
public void SayHello()
{
Console.WriteLine("Hi, Rector!");
Console.WriteLine("Welcome back to school!");
}
}
}
请注意对比在使用
using
关键字前后,代码书写的不同之处。
默认命名空间
C#语言中,如果未指定类的命名空间,则该类的命名空间为默认命名空间,C#语言中默认的命名空间为global
。
在使用默认命名空间时,需要以global::
作为前缀,示例如下:
using System;
class Program
{
static void Main(string[] args)
{
var order = new global::Order();
order.Placeorder();
Console.ReadKey();
}
}
class Order
{
public void Placeorder()
{
Console.WriteLine("正在创建订单...");
}
}
命名空间别名
C#语言中,在使用using
关键字引入命名空间时,还可以为其指定命名空间别名,比如当一个项目中引用了不同命名空间中的具有相同类名的程序集时,命名空间别名就有利用价值,示例如下:
using System;
using OsPay = Ali.OrderSystem.Shopping.Payment;
using PsPay = Ali.PaymentSystem.Payment;
class Program
{
static void Main(string[] args)
{
var osPay = new OsPay();
var psPay = new PsPay();
osPay.Pay();
psPay.Pay();
Console.ReadKey();
}
}
// 订单系统
namespace Ali.OrderSystem.Shopping
{
class Payment
{
public void Pay()
{
Console.WriteLine("订单系统发起支付...");
}
}
}
// 支付系统
namespace Ali.PaymentSystem
{
public class Payment
{
public void Pay()
{
Console.WriteLine("支付系统接收并支付...");
}
}
}
嵌套命名空间
C#编程语言中,一个命名空间可以包含另一个命名空间,它被称为嵌套命名空间。嵌套的命名空间及其成员也可以使用点(.)操作符访问。
声明嵌套命名空间的语法如下:
namespace YourNamespace
{
namespace NestedNamespace
{
// ...
}
}
嵌套命名空间示例如下:
using Ali.OrderSystem.Payment;
using Ali.OrderSystem.Shopping;
using System;
class Program
{
static void Main(string[] args)
{
var order = new Order();
order.Placeorder();
var payment = new Alipay();
payment.Pay();
Console.ReadKey();
}
}
/// <summary>
/// 命名空间--阿里的订单系统
/// </summary>
namespace Ali.OrderSystem
{
/// <summary>
/// 命名空间--购物模块
/// </summary>
namespace Shopping
{
public class Order
{
public void Placeorder()
{
Console.WriteLine("正在创建订单...");
}
}
}
/// <summary>
/// 支付模块
/// </summary>
namespace Payment
{
public class Alipay
{
public void Pay()
{
Console.WriteLine("正在支付...");
}
}
}
}
从C# 10.0开始,你可以为某个文件中定义的所有类型声明一个命名空间。
注:C# 10.0需要安装.NET 6的SDK,本文写作时已集成在Visual Studio 2022预览版(17.0.0)中。
首先,修改项目属性,将目标框架的版本修改成.NET 6,如下图:
再创建一个名为OrderSystem.cs
的类文件,并编码如下示例代码:
/// <summary>
/// 命名空间--阿里的订单系统
/// </summary>
namespace Ali.OrderSystem.Shopping;
/// <summary>
/// 订单类
/// </summary>
public class Order
{
/// <summary>
/// 创建订单
/// </summary>
public void Placeorder()
{
Console.WriteLine("正在创建订单...");
}
}
/// <summary>
/// 购物车类
/// </summary>
public class ShoppingCart
{
/// <summary>
/// 添加商品
/// </summary>
public void AddItem()
{
Console.WriteLine("正在添加商品...");
}
}
最后,在Program.cs
入口文件中编写如下代码:
using Ali.OrderSystem.Shopping;
class Program
{
static void Main(string[] args)
{
var order = new Order();
order.Placeorder();
var shoppingCart = new ShoppingCart();
shoppingCart.AddItem();
}
}
可以看到,位于OrderSystem.cs
类文件中的所有实体类的命名空间均为Ali.OrderSystem.Shopping
。
总结
C#语言的命名空间就好比家中用的收纳盒,开发者可以将物品按照自己喜欢的方式进行一一分类收纳。不至于在以后需要某个物品的时候手忙脚乱,不知道它具体存放在哪个位置。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册
热门评论(1)
刘棋 (2023-09-17)
确实挺不错的,你们觉得怎么样!