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

以下是C# 7.0至C# 14.0中类型系统新增或增强的主要内容:

C# 版本新增/增强内容发布年份描述
7.0值元组(Value Tuples)2017轻量级数据结构,支持多值返回和解构
7.2Span, ReadOnlySpan, 只读结构, 引用结构2017高性能内存操作和不可变/栈分配结构体
8.0可空引用类型, Memory, ReadOnlyMemory2019空值安全性和托管内存块
9.0记录, 本机大小整数, 初始化器专用类型2020值语义引用类型、本机整数和不可变属性
10.0记录结构, 全局 using 指令2021值类型记录和简化类型引用
11.0必需成员, 泛型数学支持, 文件局部类型2022强制初始化、泛型运算和类型作用域限制
12.0内联数组2023固定大小数组结构,优化性能
13.0参数集合扩展, 引用结构接口支持, 部分属性2024扩展params、ref struct接口和部分属性定义
14.0field关键字, 隐式 span 转换,nameof增强, lambda 参数修饰符, partial 成员扩展, 空条件赋值2025增强属性访问、span 使用、泛型处理、lambda 表达、partial 类型和空值处理

以下按版本逐一详述,每节包含特性表格、代码示例和分析。

C# 7.0:值元组

特性表格

类型/构造描述主要用途注意事项
值元组 (Value Tuples)轻量级值类型,支持多值返回、命名元素和解构方法返回多个值、临时数据分组值类型,栈分配;.NET Framework需引用System.ValueTuple包

概述

值元组基于System.ValueTuple,允许方法返回多个值,支持命名元素和解构,简化数据传递。

语法

  • 声明:(type1, type2, ...) tupleName = (value1, value2, ...);

  • 命名元素:(type1 name1, type2 name2, ...) tupleName = (value1, value2, ...);

  • 解构:var (var1, var2, ...) = tupleName;

示例代码

public (int id, string name) GetPerson()
{
return (1, "Alice");
}
var person = GetPerson();
Console.WriteLine($"ID: {person.id}, Name: {person.name}");
// 解构
var (id, name) = GetPerson();
Console.WriteLine($"ID: {id}, Name: {name}");

适用场景

  • 方法返回多个相关值。

  • 临时数据分组,无需定义类或结构。

  • 解构赋值,简化代码。

注意事项

  • 值类型,适合轻量数据。

  • .NET Framework项目需引用System.ValueTuple NuGet包。

C# 7.2:Span, ReadOnlySpan, 只读结构, 引用结构

特性表格

类型/构造描述主要用途注意事项
Span表示连续内存块的引用,支持读写高性能数组/内存操作ref struct,栈分配,生命周期限制
ReadOnlySpan只读连续内存块引用高性能只读操作同上,需确保内存边界安全
只读结构 (readonly struct)不可变结构体,优化性能不可变数据结构所有实例字段必须只读
引用结构 (ref struct)栈分配结构体高性能内存管理不可boxing或作为接口实现

概述

Span<T>ReadOnlySpan<T>是高性能值类型,表示连续内存块引用,适合数组和本机内存操作。readonly struct确保结构体不可变,ref struct限制为栈分配,支持Span<T>等类型。

语法

  • Span:Span<T> span = collection.AsSpan();

  • ReadOnlySpan:ReadOnlySpan<T> readOnlySpan = collection.AsSpan();

  • 只读结构:readonly struct StructName { ... }

  • 引用结构:ref struct StructName { ... }

示例代码

// Span<T> 和 ReadOnlySpan<T>
int[] numbers = [1, 2, 3, 4, 5];
Span<int> span = numbers.AsSpan(1, 3);
span[0] = 10;
Console.WriteLine(string.Join(", ", span.ToArray())); // 10, 3, 4
ReadOnlySpan<char> text = "Hello".AsSpan();
Console.WriteLine(text.Slice(0, 2).ToString()); // He
// 只读结构
readonly struct Point
{
public int X { get; init; }
public int Y { get; init; }
}
Point point = new() { X = 1, Y = 2 };
Console.WriteLine($"({point.X}, {point.Y})"); // (1, 2)
// 引用结构
ref struct Buffer
{
public Span<int> Data;
public Buffer(Span<int> data) => Data = data;
}
Buffer buffer = new(numbers.AsSpan());
buffer.Data[0] = 10;
Console.WriteLine(numbers[0]); // 10

适用场景

  • 高性能字符串解析、缓冲区处理。

  • 不可变数据结构(只读结构)。

  • 避免堆分配(引用结构)。

注意事项

  • Span<T>ReadOnlySpan<T>不可用于异步方法。

  • ref struct限制严格,需管理生命周期。

C# 8.0:可空引用类型, Memory, ReadOnlyMemory

特性表格

类型/构造描述主要用途注意事项
可空引用类型引用类型可标记为可空,默认非null增强空值安全性需启用可空上下文,处理编译器警告
Memory托管内存块,支持读写异步和高性能内存操作适合异步场景,需管理生命周期
ReadOnlyMemory只读托管内存块只读异步内存操作同上

概述

可空引用类型通过?后缀指定引用类型是否可为null,减少空引用异常。Memory<T>ReadOnlyMemory<T>表示托管内存块,支持异步场景。

语法

  • 可空引用类型:string? nullable; string nonNullable;

  • Memory:Memory<T> memory = collection.AsMemory();

  • ReadOnlyMemory:ReadOnlyMemory<T> readOnlyMemory = collection.AsMemory();

示例代码

// 可空引用类型
#nullable enable
string nonNullable = "Hello";
string? nullable = null;
if (nullable != null)
{
Console.WriteLine(nullable.Length);
}
// Memory<T> 和 ReadOnlyMemory<T>
int[] numbers = [1, 2, 3, 4, 5];
Memory<int> memory = numbers.AsMemory(1, 3);
Span<int> span = memory.Span;
span[0] = 10;
Console.WriteLine(string.Join(", ", memory.ToArray())); // 10, 3, 4
ReadOnlyMemory<char> text = "Hello".AsMemory();
Console.WriteLine(text.Slice(0, 2).Span.ToString()); // He

适用场景

  • 增强空值安全性(可空引用类型)。

  • 异步内存操作(Memory)。

  • 只读数据传递(ReadOnlyMemory)。

注意事项

  • 可空引用类型需显式启用。

  • Memory生命周期需管理。

C# 9.0:记录, 本机大小整数, 初始化器专用类型

特性表格

类型/构造描述主要用途注意事项
记录 (Records)具有值语义的引用类型,默认不可变数据建模,值相等性默认不可变,可添加可变行为
本机大小整数 (nint, nuint)本机大小整数,映射IntPtr/UIntPtr本机代码互操作平台依赖,需考虑兼容性
初始化器专用类型 (init-only setters)初始化后不可变属性不可变数据模型仅初始化时可赋值

概述

记录是具有值语义的引用类型,自动实现相等性。nintnuint支持本机大小整数。init修饰符增强属性不可变性。

语法

  • 记录:public record ClassName(type1 Property1, ...);

  • 本机大小整数:nint nativeInt; nuint nativeUInt;

  • init-only:public type Property { get; init; }

示例代码

// 记录
public record Person(string FirstName, string LastName);
var person1 = new Person("Alice", "Smith");
var person2 = new Person("Alice", "Smith");
Console.WriteLine(person1 == person2); // True
var person3 = person1 with { LastName = "Johnson" };
Console.WriteLine(person3); // Person { FirstName = Alice, LastName = Johnson }
// 本机大小整数
nint nativeInt = 42;
nuint nativeUInt = 42u;
Console.WriteLine($"Native int: {nativeInt}, Native uint: {nativeUInt}");
// 初始化器专用类型
public class Student
{
public string Name { get; init; }
}
var student = new Student { Name = "Alice" };
Console.WriteLine(student.Name); // Alice

适用场景

  • 数据传输对象(记录)。

  • 本机代码互操作(nint, nuint)。

  • 不可变数据模型(init-only)。

注意事项

  • 记录支持继承,需保持值语义。

  • 本机大小整数平台依赖。

C# 10.0:记录结构, 全局 using 指令

特性表格

类型/构造描述主要用途注意事项
记录结构 (Record Structs)值类型的记录,结合值语义和性能小型数据结构值类型,复制成本需考虑
全局 using 指令全局导入命名空间简化类型引用需平衡代码可读性

概述

记录结构将记录特性扩展到值类型,结合值语义和性能。全局using简化类型引用。

语法

  • 记录结构:public record struct StructName(type1 Property1, ...);

  • 全局 using:global using System;

示例代码

// 记录结构
public record struct Point(int X, int Y);
var point1 = new Point(1, 2);
var point2 = new Point(1, 2);
Console.WriteLine(point1 == point2); // True
var point3 = point1 with { X = 3 };
Console.WriteLine(point3); // Point { X = 3, Y = 2 }
// 全局 using(假设已在文件顶部)
Console.WriteLine("Hello, World!"); // 无需显式 using System

适用场景

  • 值类型数据建模(记录结构)。

  • 大型项目命名空间管理(全局 using)。

注意事项

  • 记录结构复制成本需关注。

  • 全局 using 需谨慎使用。

C# 11.0:必需成员, 泛型数学支持, 文件局部类型

特性表格

类型/构造描述主要用途注意事项
必需成员 (required members)强制成员初始化确保关键字段初始化需配合初始化器或构造函数
泛型数学支持静态抽象接口成员支持泛型运算泛型算法库需运行时支持(.NET 7+)
文件局部类型 (file modifier)限制类型作用域至文件隔离辅助类型仅限文件作用域

概述

required修饰符强制成员初始化。泛型数学支持通过接口实现数值运算。file修饰符限制类型作用域。

语法

  • 必需成员:public required type Property { get; set; }

  • 泛型数学:interface INumber<T> { static abstract T operator +(T, T); }

  • 文件局部类型:file class ClassName { ... }

示例代码

// 必需成员
public class Person
{
public required string Name { get; set; }
}
var person = new Person { Name = "Alice" };
Console.WriteLine(person.Name); // Alice
// 泛型数学支持
public interface INumber<T> where T : INumber<T>
{
static abstract T Add(T left, T right);
}
public readonly struct MyNumber : INumber<MyNumber>
{
public int Value { get; init; }
public MyNumber(int value) => Value = value;
public static MyNumber Add(MyNumber left, MyNumber right) => new(left.Value + right.Value);
}
MyNumber a = new(1);
MyNumber b = new(2);
var result = MyNumber.Add(a, b);
Console.WriteLine(result.Value); // 3
// 文件局部类型
file class Helper
{
public static void Log(string message) => Console.WriteLine(message);
}
Helper.Log("Test");

适用场景

  • API 设计(必需成员)。

  • 泛型数值计算(泛型数学)。

  • 代码生成(文件局部类型)。

注意事项

  • 必需成员需明确初始化。

  • 泛型数学需运行时支持。

C# 12.0:内联数组

特性表格

类型/构造描述主要用途注意事项
内联数组 (Inline Arrays)固定大小数组结构,栈分配高性能固定大小数组固定大小,仅限结构体内

概述

内联数组通过[InlineArray]特性定义固定大小数组结构,优化性能。

语法

[InlineArray(length)]
public struct StructName
{
private elementType _element0;
}

示例代码

[InlineArray(10)]
public struct Buffer
{
private int _element0;
}
Buffer buffer = new();
buffer[0] = 1;
buffer[9] = 10;
Console.WriteLine(buffer[0]); // 1

适用场景

  • 高性能计算。

  • 替代不安全固定缓冲区。

http://www.gsyq.cn/news/1618666.html

相关文章:

  • 基于单片机智能电饭煲 电饭锅设计保温 温度控制预约定时加热煮饭31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • KMS激活工具终极指南:5分钟彻底解决Windows和Office激活难题
  • Mysql窗口函数学习
  • 机器学习模型生产化落地:从Notebook到高韧性推理服务
  • 矩阵正交化处理:提升循环模型噪声关联回忆性能,小改进带来大提升!
  • 【热学】基于FVM实现一维稳态热传导与内部热产生的数值求解附Matlab代码
  • 我把 Conch 上传到 GitCode:用 Rust + Flutter 做一个 AI 原生的 SSH/ADB 运维工作台
  • 零壹教育:跨语言信息检索中的语义距离测量与优化策略
  • 亚马逊云代理商:AWS S3 怎么上传下载文件?
  • javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要讲故事啦~~
  • ChatGPT 充值使用与账号维护全攻略:稳定、安全、避坑指南
  • PowerBuilder 9 窗口传参核心机制、正确写法与生产致命坑避坑指南(HIS专用定稿)
  • TEL TPFB400-1 3M80-003159-Z2通讯模块
  • 从能播到准播:2026 AI直播系统技术演进与六大主流方案选型分析
  • 安旋算力:高性能与低成本的最优解
  • 为什么不建议普通前端盲目卷全栈?
  • 基于STM32单片机甲烷煤气天然气报警厨房安全火灾报警火焰物联网31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 泽医集团携手全国首批民营三甲医院东莞康华医院,锚定818新政打造医研协同新标杆
  • 2026年IEEE第二届数据科学与智能系统国际会议(DSIS 2026)
  • 不写代码的我,在AI时代还算程序员吗?
  • 鸿蒙原生ArkTS布局实战:Text组件自适应字数换行策略深度解析
  • 用 WinSCP 安全备份交换机配置
  • FATF收紧监管,虚拟资产从业者如何低成本补齐KYT/KYA?
  • SSH密钥生成与管理全解析:从算法选型到多场景实战
  • Codex 进阶与高阶技巧:从熟练到精通
  • 闵行区家政服务哪家服务好
  • ThinkPHP SQL注入防御实战:从参数绑定到查询构造器安全指南
  • 基于STM32单片机智能手环心率血氧体温计步跌倒GPS定位系统的设计32(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • Eclipse LSP服务的代码分析
  • 从MySQL到分布式:一个考试系统数据库的演进之路