C#基础17-C#10-C#13新特性
1、C#10新特性
(1)全局 Using 指令
用途:统一管理命名空间引用,避免重复声明 效果:整个项目自动注入指定命名空间,减少代码冗余
global using System ;
global using System. Collections. Generic ;
global using Newtonsoft. Json ;
var data = new List< int > { 1 , 2 , 3 } ;
Console. WriteLine ( JsonConvert. SerializeObject ( data) ) ;
(2)文件范围命名空间
用途:简化命名空间声明结构 适用场景:大型项目中的类文件,提升代码可读性
namespace MyApp { class Program { }
}
namespace MyApp ;
class Program { }
(3)记录类型增强(Record Structs)
用途:创建不可变数据结构,支持值语义 优势: 自动生成 Equals()
、ToString()
等方法 支持非破坏性修改(with
表达式)。
public record struct Point ( int X, int Y) ;
var p1 = new Point ( 1 , 2 ) ;
var p2 = p1 with { Y = 3 } ;
Console. WriteLine ( p2) ;
(4)Lambda 表达式增强
属性模式简化 案例:深度匹配嵌套属性 对比旧版:if (person != null && person.Address?.City == "Paris")
。
var person = new { Name = "Alice" , Address = new { City = "Paris" } } ;
if ( person is { Address. City: "Paris" } ) { Console. WriteLine ( "Paris resident" ) ;
}
var parse = ( string s) => int . Parse ( s) ;
var square = int ( int x) => x * x;
(5)常量字符串插值
用途:编译时计算字符串插值 限制:仅支持常量表达式插值。
const string Name = "Alice" ;
const string Greeting = $"Hello, { Name } !" ;
Console. WriteLine ( Greeting) ;
(6)其他实用特性
特性 案例 作用 调用方参数表达式 LogParameter(nameof(value))
获取参数名替代硬编码字符串 异步方法构建器 [AsyncMethodBuilder(typeof(MyBuilder))]
自定义异步方法编译行为
2、C#11新特性
(1)原始字符串字面量(Raw String Literals)
用途:简化多行字符串处理(如JSON/XML/SQL),无需转义符号 优势:
var json = "" " { "name" : "Alice" , "age" : 30 , "address" : "Paris" } "" ";
Console. WriteLine ( json) ;
(2)列表模式匹配(List Patterns)
用途:对数组或集合进行结构化匹配 案例:验证订单数据格式
int [ ] order = [ 1001 , 3 , 199 , 50 ] ;
if ( order is [ 1001 , > 0 , < 200 , .. ] )
{ Console. WriteLine ( "订单1001有效:数量>0且单价<200" ) ;
}
解析[1001, >0, <200, ..]
匹配: ① 首元素=1001 ② 次元素>0 ③ 第三元素<200 ④ ..
忽略后续元素
(3)参数空值检查(Parameter Null Checking)
void SendMessage ( string message! ! )
{ Console. WriteLine ( message. ToUpper ( ) ) ;
}
(4)UTF-8字符串字面量(UTF-8 String Literals)
byte [ ] jsonData = "C# 11 真香!" u8;
await httpResponse. WriteAsJsonAsync ( jsonData) ;
(5)文件局部类型(File-local Types)
用途:限制类型仅在当前文件内可见 案例:内部工具类封装
file static class FileLogger
{ internal static void Log ( string msg) => Console. WriteLine ( msg) ;
}
3、C#12新特性
(1)主构造器(Primary Constructors)
public class Person ( string name, int age)
{ public string Name { get ; } = name; public int Age { get ; } = age;
}
var person = new Person ( "Alice" , 30 ) ;
Console. WriteLine ( $" { person. Name } , { person. Age } " ) ;
优势: 自动生成私有字段存储参数值 避免传统构造器的冗余代码 注意:
public void ChangeName ( ) => name = "Bob" ;
(2)集合表达式(Collection Expressions)
用途:统一集合初始化语法,支持展开运算符 优势: 语法简洁度提升50%+(对比new List<int> {1,2,3}
) 编译器自动优化为最佳内存分配模式
int [ ] array = [ 1 , 2 , 3 ] ;
List< string > list = [ "a" , "b" ] ;
Span< int > span = [ .. array, 4 , 5 ] ;
int [ ] [ ] matrix = [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 ] ] ;
(3)原始字符串字面量(Raw String Literals)
用途:处理多行文本(如JSON/XML)无需转义符 案例:SQL查询场景
var sql = "" "SELECT * FROM Users WHERE Age > @minAgeAND Name LIKE '% @keyword% 'ORDER BY CreateTime DESC"" ";
var sql = "SELECT * FROM Users\n" + "WHERE Age > @minAge\n" + "AND Name LIKE '%@keyword%'" ;
const string table = "Users" ;
var sql = $$"" "SELECT * FROM { { table} } "" ";
(4)Lambda增强特性
var greet = ( string name, string prefix = "Hello" ) => $" { prefix } , { name } !" ;
Console. WriteLine ( greet ( "Alice" ) ) ;
var parse = int ( string s) => int . Parse ( s) ;
(5)类型别名扩展(Any Type Aliases)
using Point = ( int X, int Y) ; Point p1 = ( 10 , 20 ) ;
Console. WriteLine ( p1. X) ;
(6)内联数组(Inline Arrays)
用途:高性能场景的固定大小数组 案例:游戏开发中的坐标缓冲区
[ System. Runtime. CompilerServices. InlineArray ( 4 ) ]
public struct Vec4Buffer
{ private float _element0;
}
var buffer = new Vec4Buffer ( ) ;
buffer[ 0 ] = 1.0f ;
4、C#13新特性
(1)扩展类型(Extension Types)
用途:革命性突破,支持扩展实例成员、属性、静态方法,无需侵入原始类,不支持扩展密封类 案例1:隐式扩展属性
implicit extension PersonExtension for Person { public int BirthYear => DateTime. Now. Year - this . Age;
}
var person = new Person ( "Alice" , 30 ) ;
Console. WriteLine ( person. BirthYear) ;
explicit extension StudentExtension for Person { public void SubmitHomework ( ) => Console. WriteLine ( "Homework submitted" ) ;
}
if ( person is StudentExtension student) student. SubmitHomework ( ) ;
优势: 解决传统扩展方法无法添加属性的痛点 显式扩展支持类型投影,增强多态能力
(2)原始字符串字面量增强
用途:简化多行文本处理,支持嵌套内插值 案例:生成带变量的HTML模板
const string color = "blue" ;
var html = $$"" "< div style= "color:{{{color}}}" > < h1> { { { DateTime. Now. Year} } } Conference< / h1> < / div> "" ";
关键改进: 双$$
前缀允许内嵌{{}}
表达式 保留所有缩进和换行,无需转义符
(3)高性能线程锁(System.Threading.Lock)
用途:替代传统lock
关键字,减少70%同步开销 案例:线程安全计数器
private readonly Lock _lock = new ( ) ;
private int _count; void Increment ( ) { using ( _lock. EnterScope ( ) ) _count++ ;
}
场景 传统lock Lock类型 100万次单线程锁 120ms 35ms 并发争用场景 高抖动 稳定低延迟
(4)集合表达式增强
用途:统一集合初始化,支持尾部索引和展开运算符 案例:矩阵初始化与尾部修改
int [ ] [ ] matrix = [ [ 1 , 2 ] , [ 3 , 4 ] ] ;
matrix[ ^ 1 ] = [ .. matrix[ ^ 1 ] , 5 ] ;
(5)转义序列标准化
Console. WriteLine ( "ESC:\e" ) ;
(6)方法组自然类型优化
Action handler = Log;
void Log ( string s) { }
void Log ( int i) { }
(7)Params集合泛化
void Print ( params IEnumerable< string > items) { .. . }
Print ( [ "A" , "B" ] ) ;
Print ( new List< string > { "C" } ) ;