当前位置: 首页 > news >正文

C#基础17-C#10-C#13新特性

零、文章目录

C#基础17-C#10-C#13新特性

1、C#10新特性

(1)全局 Using 指令
  • 用途:统一管理命名空间引用,避免重复声明
  • 效果:整个项目自动注入指定命名空间,减少代码冗余
// GlobalUsings.cs 
global using System;
global using System.Collections.Generic;
global using Newtonsoft.Json;
// Program.cs
var data = new List<int> { 1, 2, 3 };
Console.WriteLine(JsonConvert.SerializeObject(data)); // 无需额外using 
(2)文件范围命名空间
  • 用途:简化命名空间声明结构
  • 适用场景:大型项目中的类文件,提升代码可读性
// 传统方式 
namespace MyApp {class Program { /* ... */ }
}
// C#10 新语法 
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 }; // 使用with表达式创建副本 
Console.WriteLine(p2); // 输出:Point { X = 1, Y = 3 }
(4)Lambda 表达式增强
  • 属性模式简化
    • 案例:深度匹配嵌套属性
    • 对比旧版:if (person != null && person.Address?.City == "Paris")
var person = new { Name = "Alice", Address = new { City = "Paris" } };
if (person is { Address.City: "Paris" }) { // C#10 新语法Console.WriteLine("Paris resident");
}
  • 显式返回类型
    • 案例:明确Lambda返回值类型
var parse = (string s) => int.Parse(s); // 自动推断
var square = int (int x) => x * x;     // 显式声明返回int 
(5)常量字符串插值
  • 用途:编译时计算字符串插值
  • 限制:仅支持常量表达式插值。
const string Name = "Alice";
const string Greeting = $"Hello, {Name}!"; // C#10 支持 
Console.WriteLine(Greeting); // 输出:Hello, Alice!
(6)其他实用特性
特性案例作用
调用方参数表达式LogParameter(nameof(value))获取参数名替代硬编码字符串
异步方法构建器[AsyncMethodBuilder(typeof(MyBuilder))]自定义异步方法编译行为

2、C#11新特性

(1)原始字符串字面量(Raw String Literals)
  • 用途:简化多行字符串处理(如JSON/XML/SQL),无需转义符号
  • 优势:
    • 保留原始缩进和换行符
    • 支持内插表达式(前缀$
// C# 11 新语法
var json = """  {  "name": "Alice",  "age": 30,  "address": "Paris"  }  """;  
Console.WriteLine(json); // 直接输出完整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)
  • 用途:自动生成参数非空验证代码
// C# 11 新语法  
void SendMessage(string message!!)  
{  Console.WriteLine(message.ToUpper());  
}  
// 等效传统写法:  
// if (message == null) throw new ArgumentNullException(nameof(message));  
  • 效果:
    • !!自动在方法入口插入空值检查
    • 减少样板代码
(4)UTF-8字符串字面量(UTF-8 String Literals)
  • 用途:优化文本编码内存开销
  • 案例:API响应处理
byte[] jsonData = "C# 11 真香!"u8;  // 直接转UTF-8字节数组  
await httpResponse.WriteAsJsonAsync(jsonData);  
  • 优势:
    • 避免运行时编码转换
    • 降低Web应用内存占用
(5)文件局部类型(File-local Types)
  • 用途:限制类型仅在当前文件内可见
  • 案例:内部工具类封装
// Helper.cs  
file static class FileLogger  // 仅当前文件可用  
{  internal static void Log(string msg) => Console.WriteLine(msg);  
}  
  • 适用场景:
    • 避免公共命名空间污染
    • 隐藏辅助逻辑

3、C#12新特性

(1)主构造器(Primary Constructors)
  • 用途:简化类/结构体的构造函数定义,直接捕获参数
// C# 12 新语法
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}"); // Alice,30 
  • 优势:
    • 自动生成私有字段存储参数值
    • 避免传统构造器的冗余代码
  • 注意:
// 禁止在构造器外修改参数(编译错误)
public void ChangeName() => name = "Bob"; // 错误:name是只读的
(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""";
  • 对比旧版:
// C# 11需逐行转义 
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")); // Hello, Alice!
  • 显式返回类型
var parse = int (string s) => int.Parse(s); // 明确返回int 
(5)类型别名扩展(Any Type Aliases)
  • 用途:为复杂类型创建语义化别名
  • 案例:简化元组使用
using Point = (int X, int Y); // 类型别名Point p1 = (10, 20);
Console.WriteLine(p1.X); // 10 
  • 适用场景:
    • 替代部分DTO类
    • 增强API可读性
(6)内联数组(Inline Arrays)
  • 用途:高性能场景的固定大小数组
  • 案例:游戏开发中的坐标缓冲区
[System.Runtime.CompilerServices.InlineArray(4)]
public struct Vec4Buffer 
{private float _element0; // 底层存储
}// 使用 
var buffer = new Vec4Buffer();
buffer[0] = 1.0f; // 像数组一样访问 
  • 性能优势:
    • 避免堆分配,减少GC压力
    • 适合实时系统

4、C#13新特性

(1)扩展类型(Extension Types)
  • 用途:革命性突破,支持扩展实例成员、属性、静态方法,无需侵入原始类,不支持扩展密封类
  • 案例1:隐式扩展属性
// C# 13 新语法 
implicit extension PersonExtension for Person {public int BirthYear => DateTime.Now.Year - this.Age; // 扩展计算属性 
}// 使用
var person = new Person("Alice", 30);
Console.WriteLine(person.BirthYear); // 直接调用扩展属性 → 1994
  • 案例2:显式扩展实现多态
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>""";
// 输出:<div style="color:blue"><h1>2025 Conference</h1></div>
  • 关键改进:
    • $$前缀允许内嵌{{}}表达式
    • 保留所有缩进和换行,无需转义符
(3)高性能线程锁(System.Threading.Lock)
  • 用途:替代传统lock关键字,减少70%同步开销
  • 案例:线程安全计数器
private readonly Lock _lock = new();
private int _count;void Increment() {using (_lock.EnterScope()) // 获取轻量级锁_count++;
}
  • 性能对比:
场景传统lockLock类型
100万次单线程锁120ms35ms
并发争用场景高抖动稳定低延迟
(4)集合表达式增强
  • 用途:统一集合初始化,支持尾部索引和展开运算符
  • 案例:矩阵初始化与尾部修改
int[][] matrix = [[1, 2], [3, 4]]; 
matrix[^1] = [..matrix[^1], 5]; // 尾部追加元素 → [[1,2],[3,4,5]]
  • 新操作符:
    • ^1 直接访问最后一个元素
    • .. 展开集合内容
(5)转义序列标准化
  • 价值:跨平台字符编码统一
Console.WriteLine("ESC:\e"); // 输出ESC字符(等价于\u001B)
(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"}); // 支持集合
http://www.dtcms.com/a/463379.html

相关文章:

  • 协会秘书处工作建设 网站wordpress安装虚拟主机
  • 百度做网站电话多少网站建设+管理系统开发
  • 深圳外贸网站外贸网站建设做电子商城网站注意事项
  • 湖南省建设信息网站网页制作培训学院
  • 在线做c 题的网站无锡开发网站建设
  • 网站片头怎么做学生个人作品集如何制作
  • 网站用什么框架企业型网站建设制作平台
  • wordpress跨站脚本攻击漏洞便宜网站建设哪家好
  • 网站搭建语言装修广告牌设计图片
  • 专业的网站建设与优化天台网站建设
  • 广东企业网站建设多少钱来宾网站建设公司
  • Thread构造函数详解
  • 南昌电商购物网站开发网站开发流程 图书
  • 什么做书籍的网站好网站 架构设计
  • 怎么做的英文网站私有云可以做网站
  • 化妆品公司网站模板wordpress屏蔽索引
  • 网站仿制教程做舞台灯光的在哪些网站接订单呢
  • Web 开发 25
  • 网站seo分析报告案例wordpress 手机更新
  • 成都软件定制宁波seo整站优化
  • 网站建立计划书南宁平台公司
  • 住建设部官方网站wordpress主题编辑
  • 网站需要什么服务器重庆市建设工程信息网劳务资质查询
  • 华为公司电子商务网站建设策划书网站建设 微信营销
  • 如何让搜索引擎不收录网站潮州东莞网站建设
  • 【OA办公系统】神点企业OA办公助手/全开源
  • 网站做支付宝花呗分期制作公司网站设计手绘
  • 10黄页网站建设四川在建项目信息查询
  • 广西建设工会网站个人游戏开发者 死路一条
  • 网站制作自己绍兴高端网站开发