news 2026/6/10 23:18:58

C#12 中的 Using Alias

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#12 中的 Using Alias

一、什么是 Using Alias

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

基本语法:

usingAliasName=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 支持元组类型

usingPoint=(intX,intY);// 使用别名Pointp=(10,20);Console.WriteLine(p.X);// 输出 10

代码解析:

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

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

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

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

2.3 支持开放泛型

usingPair<T>=(TFirst,TSecond);varpair=newPair<int>(1,2);Console.WriteLine(pair.First+pair.Second);// 输出 3

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

2.4 支持ref struct​ 和readonly ref struct

usingSpanOfInt=System.ReadOnlySpan<int>;SpanOfIntspan=stackallocint[]{1,2,3};

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

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

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

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

使用 C#12 别名重构:

// 定义清晰的可读别名usingOrderKey=(intOrderId,stringCustomerName);usingOrderEntry=(DateTime Timestamp,decimalAmount);Dictionary<OrderKey,List<OrderEntry>>cache=new();// 添加数据cache.Add((1001,"张三"),newList<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 类型起短名

【提示】官方文档已经同步更新,建议前往 Microsoft Learn: using directive 浏览更完整的语法细节。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 23:18:16

压敏电阻 Cp 参数怎么看?电源端与信号端应用差异解析

在压敏电阻规格书中&#xff0c;除了工作电压、压敏电压、钳位电压、浪涌电流等常见参数外&#xff0c;经常还能看到Capacitance、Typical Capacitance 或 Device Capacitance 这类电容参数。有些技术资料也会用 Cp 来表示这个电容特性。这个参数在电源浪涌保护中通常不是首要选…

作者头像 李华
网站建设 2026/6/10 23:17:14

Cursor主侧边栏从左侧改到右侧

如果要将Agent对话调整到左边&#xff0c;文件查看在右边。可以修改对应的settings.json文件 针对当前项目&#xff0c;可以新增.vscode/settings.json&#xff0c; 添加 {"workbench.sideBar.location": "right" }这样secondary side bar就会自动到对面了…

作者头像 李华
网站建设 2026/6/10 23:11:34

华三二层交换机 极简完整版配置

适用场景&#xff1a;企业接入层、办公网络、监控网络、通用场景1. 基础系统配置<H3C> system-view # 进入系统配置视图[H3C] sysname L2-Access-SW # 修改设备名称为接入交换机[L2-Access-SW] undo info-center enable # 关闭日志弹窗&#xff0c;方便配置[L2-Access…

作者头像 李华
网站建设 2026/6/10 23:07:27

海参行业的这些坑,99%的人都踩过!

海参市场鱼龙混杂&#xff0c;消费者稍不留神就可能吃亏上当。作为普通消费者&#xff0c;如何在选购海参时避开各种陷阱&#xff1f;下面我们就来盘点海参行业最常见的几大坑&#xff0c;帮助大家练就火眼金睛。坑一&#xff1a;虚假产地宣传最常见的陷阱是产地造假。一些商家…

作者头像 李华
网站建设 2026/6/10 23:02:59

Windows系统文件d3dx9_43.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华