C#12中Using Alias的使用小结

 更新时间:2026年06月20日 09:21:29   作者:叫我少年  
详细介绍了C#中using别名的使用和新特性,特别强调了C#1中扩展了using别名的适用范围,包括支持元组类型、指针类型、开放泛型等,感兴趣的可以了解一下

一、什么是 Using Alias

Using Alias 是 C# 中 using 指令的一种形式,允许为类型或命名空间定义一个简短的别名。早在 C# 1.0 就存在,但一直有严格限制。

基本语法:

using AliasName = Fully.Qualified.TypeName;

旧版支持的类型(C# 1~11):

  • 普通类、结构体、接口、委托
  • 封闭泛型(如 List<int>
  • 值类型(如 int​, decimal

旧版不支持的类型:

  • 元组类型((int, string)
  • 指针类型(int*
  • 开放泛型(List<T>
  • ref struct 等特殊类型

这些限制导致开发者在处理复杂类型签名时不得不重复书写冗长的声明,降低了代码可读性。

二、C#12 的新变化

C#12 大幅扩展了 using alias​ 的适用范围,允许为任何类型创建别名,包括之前被排除在外的类型。

2.1 支持元组类型

using Point = (int X, int Y);

// 使用别名
Point p = (10, 20);
Console.WriteLine(p.X); // 输出 10

代码解析:

  1. using Point = (int X, int Y) 定义了元组别名,成员名可以保留
  2. p.X 依然可以访问元组的命名元素,类型推断完全正常

2.2 支持指针类型(需 unsafe 上下文)

using IntPtr = int*;

unsafe
{
    int value = 42;
    IntPtr ptr = &value;
    Console.WriteLine(*ptr); // 输出 42
}

划重点: 必须在 unsafe​ 块或者项目开启 AllowUnsafeBlocks 才能使用指针别名,但这解除了长久以来的限制,让底层互操作代码更整洁。

2.3 支持开放泛型

using Pair<T> = (T First, T Second);

var pair = new Pair<int>(1, 2);
Console.WriteLine(pair.First + pair.Second); // 输出 3

常见坑: 开放泛型别名不能用作泛型约束的基类型,也不能被继承。它只是一个类型符号替代。

2.4 支持ref struct​ 和readonly ref struct

using SpanOfInt = System.ReadOnlySpan<int>;
SpanOfInt span = stackalloc int[] { 1, 2, 3 };

意义: ref struct​ 以前无法通过别名引用,现在可以了,方便简化高频使用的 Span<T> 等类型。

三、实际示例:简化复杂 API 签名

假设有一个方法需要处理多个 Dictionary<(int, string), List<(DateTime, decimal)>> 类型,不用别名时代码可读性极差:

// 没有别名:可读性灾难
Dictionary<(int, string), List<(DateTime, decimal)>> cache = new();

使用 C#12 别名重构:

// 定义清晰的可读别名
using OrderKey = (int OrderId, string CustomerName);
using OrderEntry = (DateTime Timestamp, decimal Amount);

Dictionary<OrderKey, List<OrderEntry>> cache = new();

// 添加数据
cache.Add(
    (1001, "张三"),
    new List<OrderEntry> { (DateTime.Now, 99.9m) }
);

核心解析:

  1. 别名让业务含义显现,OrderKey​ 代替了 (int, string)
  2. 即使底层类型不变,阅读代码时心理负担大大降低
  3. 重构时只需修改别名定义,所有引用自动更新

四、限制与注意事项

限制说明
作用域别名只在当前文件中生效(除非使用 global using,C#10 起支持)
同名冲突同一作用域内不能存在同名类型或别名,编译器优先选择实际类型
不能用作基类型别名不能出现在 class MyClass : MyAlias
不能用在表达式里别名只能出现在类型位置,不能作为值或变量使用
开放泛型限制开放泛型别名不能用于 typeof​、nameof、泛型约束

常见坑: 误以为别名会创建新类型——实际上它只是编译时的语法糖,运行时不产生额外类型信息。typeof(Alias) 展开为原始类型。

最佳实践:

  • 别名应该有意义,体现业务语义(如 CustomerId​ 而非 IdIntString
  • 对于跨文件共享的别名,使用 global using​ 放在 GlobalUsings.cs
  • 避免过度使用,只在确实能提升可读性的场景使用(比如频繁出现的复杂泛型、元组)

五、总结

C#12 的 using alias​ 升级是一次务实的改进:不引入新语法,只消除旧限制。它让元组、指针、开放泛型等类型也能享受别名的便利,尤其适合:

  • 处理大量元组或嵌套泛型的领域驱动设计代码
  • 底层互操作(指针别名)
  • 测试代码中为复杂 mock 类型起短名

到此这篇关于C#12中Using Alias的使用小结的文章就介绍到这了,更多相关C#12 Using Alias内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c# record的使用场景

    c# record的使用场景

    这篇文章主要介绍了c# record的使用场景,帮助大家更好的理解和学习使用c#的新特性,感兴趣的朋友可以了解下
    2021-02-02
  • C#使用GET、POST请求获取结果

    C#使用GET、POST请求获取结果

    这篇文章主要以一个简单的用户登陆为例,详细介绍了C#使用GET、POST请求获取结果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • C# 参考之访问关键字:base、this

    C# 参考之访问关键字:base、this

    由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有 this 指针。在静态方法中引用 this 是错误的。 索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。
    2008-03-03
  • C#实现不同窗体之间传递参数

    C#实现不同窗体之间传递参数

    这篇文章主要介绍了C#实现不同窗体之间传递参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Unity向量按照某一点进行旋转

    Unity向量按照某一点进行旋转

    这篇文章主要为大家详细介绍了Unity向量按照某一点进行旋转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C# 系统热键注册实现代码

    C# 系统热键注册实现代码

    简单点说就是为程序制定快捷键勒。。很多软件都带热键功能的,通过以下方式可以实现2个键或3个键的快捷键,相当之使用,具体实现方法看后文吧。
    2009-02-02
  • C#使用WebClient实现文件上传的操作步骤

    C#使用WebClient实现文件上传的操作步骤

    这篇文章主要介绍了C#使用WebClient实现文件上传的操作步骤,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-11-11
  • C#代码实现添加或读取Excel公式的完整指南

    C#代码实现添加或读取Excel公式的完整指南

    在日常的办公数据处理任务中,Excel 公式和函数是自动化计算和数据分析的基石,本文将借助 Free Spire.XLS for .NET 这款轻量级且免费的组件,详细演示如何使用 C# 实现 Excel 公式的添加与读取操作,感兴趣的小伙伴可以了解下
    2026-05-05
  • C#使用Socket进行简单的通讯的示例代码

    C#使用Socket进行简单的通讯的示例代码

    Socket 类是基于与 Linux、macOS 或 Windows 的本机互操作性提供的托管代码版本的套接字服务,提供了一系列的接口来支持应用层的调用,下面我们就来学习一下如何使用Socket进行简单的通讯,需要的可以参考下
    2023-12-12
  • Unity Shader实现动态过场切换图片效果

    Unity Shader实现动态过场切换图片效果

    这篇文章主要为大家详细介绍了Unity Shader实现动态过场切换图片效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论