NET各个版本新增的特性和语法糖

news/2025/9/29 17:31:07/文章来源:https://www.cnblogs.com/hanyaoguo/p/19119171

以下是按C#版本从低到高整理的.NET相关版本特性,补充了发布年份及对应的.NET Core/.NET版本信息,包含特性概念、作用、优势及示例:

C# 6.0

  • 对应版本:.NET Framework 4.6(2015年)、.NET Core 1.0(2016年)
  • 核心特性
  1. 自动属性初始化器

    • 概念:属性声明时直接赋值默认值,无需在构造函数中初始化。
    • 作用:减少构造函数中的重复代码,默认值更直观。
    • 优势:代码简洁,初始化逻辑集中在属性定义处。
    • 示例
      public class User {public string Username { get; set; } = "guest"; // 直接初始化public int LoginCount { get; set; } = 0;
      }
      
  2. 字符串插值($)

    • 概念:用$标记字符串,通过{变量/表达式}直接嵌入值,替代String.Format
    • 作用:简化字符串拼接,避免占位符顺序错误。
    • 优势:可读性提升,编写效率更高。
    • 示例
      int id = 100;
      string msg = $"User ID: {id}, Status: {id > 0 ? "Valid" : "Invalid"}";
      
  3. 空传播运算符(?.)

    • 概念:访问成员前自动检查对象是否为null,避免NullReferenceException
    • 作用:替代多层if (obj != null)判断。
    • 优势:代码紧凑,减少空值判断冗余。
    • 示例
      int? length = user?.Address?.City?.Length; // 任意环节为null则返回null
      

C# 7.0/7.1

  • 对应版本:.NET Framework 4.7(2017年)、.NET Core 2.0(2017年)
  • 核心特性
  1. 元组(Tuples)

    • 概念:轻量级数据结构,可直接存储多个不同类型的值,无需定义类。
    • 作用:方便方法返回多值,替代out参数或自定义实体类。
    • 优势:语法简洁,支持解构赋值。
    • 示例
      (string Name, int Age) GetUser() => ("Tom", 28); // 元组返回值
      var (name, age) = GetUser(); // 解构
      
  2. 模式匹配(is表达式)

    • 概念:结合类型判断与变量赋值,简化类型转换逻辑。
    • 作用:替代as转换+null检查的繁琐写法。
    • 优势:逻辑清晰,减少类型转换错误。
    • 示例
      if (input is int num) { // 若input是int,直接赋值给numConsole.WriteLine(num * 2);
      }
      
  3. 本地函数

    • 概念:在方法内部定义的函数,仅在当前方法内可见。
    • 作用:封装仅当前方法使用的逻辑,避免命名空间污染。
    • 优势:提高代码内聚性,减少类级冗余方法。
    • 示例
      int Calculate(int x, int y) {int Multiply(int a, int b) => a * b; // 本地函数return Multiply(x, y) + 10;
      }
      

C# 8.0

  • 对应版本:.NET Core 3.0(2019年)、.NET Standard 2.1(2019年)
  • 核心特性
  1. 可空引用类型

    • 概念:通过?标记引用类型可能为null,编译器主动检查空值风险。
    • 作用:提前暴露潜在的NullReferenceException,降低运行时错误。
    • 优势:代码更健壮,空值逻辑显性化。
    • 示例
      #nullable enable
      string? nullableStr = null; // 允许为null
      string nonNullableStr = null; // 编译警告(禁止为null)
      
  2. 默认接口方法

    • 概念:接口中可定义带实现的方法,无需所有实现类强制重写。
    • 作用:安全扩展现有接口,兼容旧版本实现类。
    • 优势:接口演进更灵活,避免“修改接口导致所有实现崩溃”。
    • 示例
      public interface IDataStore {void Save(string data); // 抽象方法void LogError(string error) => Console.WriteLine($"Error: {error}"); // 默认实现
      }
      
  3. 异步流(IAsyncEnumerable

    • 概念:结合异步与迭代器,支持逐个返回异步结果(非一次性加载)。
    • 作用:适用于大数据流或网络请求,减少内存占用。
    • 优势:降低内存压力,支持异步迭代。
    • 示例
      async IAsyncEnumerable<int> FetchDataAsync() {for (int i = 0; i < 3; i++) {await Task.Delay(100); // 模拟异步操作yield return i;}
      }
      // 消费:await foreach
      await foreach (var item in FetchDataAsync()) { ... }
      

C# 9.0

  • 对应版本:.NET 5.0(2020年11月,首次统一.NET平台,替代.NET Core)
  • 核心特性
  1. 记录类型(Record)

    • 概念:不可变引用类型,自动实现值相等性(而非引用相等性)。
    • 作用:简化“仅存储数据”的类,自动生成EqualsToString等方法。
    • 优势:不可变性确保线程安全,减少相等性检查代码。
    • 示例
      public record Product(string Name, decimal Price);
      var p1 = new Product("Laptop", 5000);
      var p2 = new Product("Laptop", 5000);
      Console.WriteLine(p1 == p2); // True(值相等)
      
  2. 顶级语句

    • 概念:无需显式定义Program类和Main方法,直接编写代码作为程序入口。
    • 作用:简化小程序或脚本的编写,减少样板代码。
    • 优势:降低入门门槛,代码更简洁。
    • 示例
      // 完整程序,无需class和Main
      Console.WriteLine("Hello .NET 5!");
      
  3. 模式匹配增强(范围模式)

    • 概念:支持>, <, >=, <=等比较运算符在模式匹配中使用。
    • 作用:简化范围判断逻辑,替代多层if-else
    • 优势:逻辑直观,代码紧凑。
    • 示例
      string GetGrade(int score) => score switch {>= 90 => "A",>= 60 and < 90 => "B",_ => "C"
      };
      

C# 10.0

  • 对应版本:.NET 6.0(2021年11月)
  • 核心特性
  1. 文件范围的命名空间

    • 概念:用namespace 命名空间;声明,整个文件的类型自动属于该命名空间(无需大括号)。
    • 作用:减少代码缩进,简化命名空间声明。
    • 优势:避免多层嵌套,提高可读性。
    • 示例
      namespace MyApp; // 文件范围命名空间
      class Order { ... } // 自动属于MyApp
      
  2. 全局using指令

    • 概念:在文件中用global using 命名空间;声明,整个项目自动引入该命名空间。
    • 作用:减少每个文件中的重复using语句。
    • 优势:统一命名空间管理,简化代码。
    • 示例
      // GlobalUsings.cs
      global using System;
      global using System.Linq;
      // 其他文件直接使用,无需重复using
      var list = new List<int>();
      
  3. 密封记录(Sealed Record)

    • 概念sealed record禁止被继承,确保记录类型的行为稳定性。
    • 作用:限制继承层次,避免意外修改记录逻辑。
    • 优势:提高代码可维护性,防止继承滥用。
    • 示例
      public sealed record Point(int X, int Y);
      // public record ExtendedPoint : Point { } // 编译错误:无法继承密封记录
      

C# 11.0

  • 对应版本:.NET 7.0(2022年11月)
  • 核心特性
  1. 原始字符串字面量(Triple Quotes)

    • 概念:用"""包裹字符串,支持多行文本和特殊字符(无需转义)。
    • 作用:简化JSON、SQL、HTML等复杂格式字符串的编写。
    • 优势:减少转义符(\),提高可读性。
    • 示例
      string sql = """SELECT * FROM UsersWHERE Name = "John" AND Age > 30
      """; // 无需转义双引号和换行
      
  2. required成员

    • 概念:用required标记属性,强制实例化时必须显式初始化。
    • 作用:确保对象关键属性不被遗漏,替代构造函数参数检查。
    • 优势:支持对象初始化器,同时保证必填项。
    • 示例
      public class Book {public required string Title { get; set; } // 必须初始化
      }
      var book = new Book { Title = "C# 11 Guide" }; // 正确
      // var book = new Book(); // 编译错误:缺少required成员
      
  3. 泛型属性

    • 概念:属性类可定义为泛型(class MyAttr<T> : Attribute),使用时直接指定类型。
    • 作用:简化需要类型信息的属性场景(如验证、序列化)。
    • 优势:避免字符串传递类型名,提高类型安全性。
    • 示例
      public class TypeValidatorAttribute<T> : Attribute { }
      [TypeValidator<string>] // 直接指定泛型参数
      public class DataProcessor { }
      

C# 12.0

  • 对应版本:.NET 8.0(2023年11月)
  • 核心特性
  1. 集合表达式

    • 概念:用统一的[]语法初始化数组、ListHashSet等集合,支持展开(..)。
    • 作用:替代不同集合的初始化器语法,统一风格。
    • 优势:代码简洁,支持集合合并。
    • 示例
      int[] arr = [1, 2, 3];
      List<int> list = [4, 5, .. arr]; // 展开arr,结果:[4,5,1,2,3]
      
  2. 类/结构体的主构造函数

    • 概念:在类声明时直接定义构造函数参数,参数可在类内直接使用。
    • 作用:简化字段与构造函数的绑定代码。
    • 优势:减少“定义字段→构造函数赋值”的重复步骤。
    • 示例
      public class Car(string model, int year) {public string Model => model;public int Year => year;
      }
      var car = new Car("Tesla", 2023);
      
  3. 扩展方法的泛型约束增强

    • 概念:扩展方法的this参数可添加更灵活的泛型约束(如where T : struct)。
    • 作用:精确限制扩展方法的适用类型,提高安全性。
    • 优势:避免扩展方法被误用在不兼容类型上。
    • 示例
      public static T Square<T>(this T value) where T : struct {return value * value; // 仅适用于值类型(如int, double)
      }
      

总结

从2015年的C# 6.0到2023年的C# 12.0,.NET(含.NET Core)的发展趋势是:

  1. 简化样板代码(如顶级语句、集合表达式);
  2. 增强类型安全(如可空引用类型、泛型属性);
  3. 提升开发效率(如字符串插值、模式匹配);
  4. 优化兼容性(如默认接口方法)。

每个版本的特性均围绕“减少冗余、提高健壮性、降低复杂度”展开,逐步提升C#的开发体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xinference推理embedding等小模型

使用容器方式的xinference管理小模型,带鉴权、带本地模型加载embedding、rerank模型不少,需要一个框架来集中管理,选用了xinference,使用简单。采取容器化部署: 1、镜像下载:原始模型下载慢,采用渡渡鸟,下载 2…

day15-项目上线

今日内容 1 项目上线架构# 1 购买云服务---操作系统--》centos9-上线到公网 # 2 nginx-转发用户的请求--》到uwsgi的django项目# 3 mysql8-后端项目数据存储在mysql中# 4 上传我们后端项目-导入项目依赖:requirements…

Docker入门 - 实践

Docker入门 - 实践2025-09-29 17:19 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

长沙百度推广公司电话太原seo关键词排名优化

了解哪一种 for 循环或迭代器适合我们的需求&#xff0c;防止我们犯下一些影响应用性能的低级错误。 由 Artem Sapegin 上传至 Unsplash JavaScript 是 Web 开发领域的“常青树”。无论是 JavaScript 框架&#xff08;如 Node.js、React、Angular、Vue 等&#xff09;&#x…

个人做美食视频网站wordpress自定义字段插件

本文实例讲述了Python使用matplotlib绘图无法显示中文问题的解决方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 在python中&#xff0c;默认情况下是无法显示中文的&#xff0c;如下代码&#xff1a; import matplotlib.pyplot as plt # 定义文本框和箭头格式 d…

自己怎么做企业网站烟台主流网站

前言最近看了某客时间的《Java业务开发常见错误100例》&#xff0c;再结合平时踩的一些代码坑&#xff0c;写写总结&#xff0c;希望对大家有帮助&#xff0c;感谢阅读~1. 六类典型空指针问题包装类型的空指针问题级联调用的空指针问题Equals方法左边的空指针问题ConcurrentHas…

网站内页上海机械网站建设

完整课程请点击以下链接 Go 语言项目开发实战_Go_实战_项目开发_孔令飞_Commit 规范_最佳实践_企业应用代码-极客时间 Go语言中没有传统意义上的类和继承的概念&#xff0c;但可以通过嵌入类型&#xff08;embedded types&#xff09;来实现类似的功能。嵌入类型允许一个结构…

程序员用什么软件亚马逊seo什么意思

1. 什么是HTTP协议 HTTP是应用层的协议。Java最主要的应用场景是做网站&#xff0c;而网站由 后端&#xff08;HTTP服务器&#xff09; 和 前端&#xff08;浏览器&#xff09;组成&#xff0c;HTTP协议就是负责这里后端和前端的数据交互。 HTTP3.0 之前在传输层是通过 TCP传…

opencv学习记录6

图像金字塔图像金字塔 高斯金字塔 向下取样----pyrDown (1)对图像进行高斯卷积核 (2)删除所有偶数行和列其中,高斯核卷积运算(高斯滤波)就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的…

努力的轨迹,通往成长的旅程——赵欣彤的自我介绍

老师、助教和各位同学们您好,我是赵欣彤。这篇博客是想和您做一个简单的自我介绍。虽然还不够成熟和优秀,但我很愿意学习、改进,也希望在课程中积极参与团队合作和项目实践。期待能在您的指导下和同学们一起成长。�…

第2章 day02 requests基础

爬虫初始 爬虫相关介绍什么是爬虫?爬虫程序是需要充当B/S或者C/S架构中的客户端。 爬虫程序需要模拟客户端进行请求发送,然后获取服务器端对应的相关数据。 在B/S架构中爬虫程序模拟的就是浏览器。提问:如果日后你的…

WebAPI开发步骤

WebAPI开发步骤1.在VS2022中选择新建项目,选择 ASP.Net Core Web API.2.我们先用CodeFirst,即先建数据表模型,再用EF Core写入数据库定义User类,在新建文件夹Models下,里面可以建多个对应数据库中的表实体 在NuGet…

台州公司网站外包晋州建设规划局网站

一 insert 语句 强调&#xff1a; 本文介绍的内容很基础,仅做记录用,参考价值较少 ① 总述 目的&#xff1a; 增加rows记录1、完整格式insert [into] 表名[字段名1[, 字段名2]] value[s](值1, 值2);备注&#xff1a;指定部分字段添加,没有被指定的字段要么会自动增长,要…

线性代数_工程实践-计算实现numpy

点云和坐标变换数学概念 1.矩阵乘法01.两个矩阵A和B相乘,需要满足A的列数等于B的行数02.单位矩阵 如果A是nn矩阵,I是单位矩阵,则AI= A, IA = A03.逆矩阵 矩阵A的逆矩阵 A^-1, A A^-1=A^-1A= I,I是单位矩阵 当…

广州网站定制开发定制美瞳网站建设

之前为了做控规&#xff0c;从湘源8中扒了一套国空用地用海的绘图参数给湘源7使用。 【预告】在湘源控规7中使用 国空用地用海分类标准 但是部里在2023年11月又发布了一套新的用地用海分类。 本想去湘源8里面再扒一下&#xff0c;结果发现湘源8自己还没有更新呢&#xff0c;…

在HAL库使用printf打印串口信息

以STM32F103为例,在hal库中选择usart1,设置按下图配置并在usart.c文件内新增以下函数:点击查看代码 #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __…

第3章 day03 xpath+反爬虫

上次直播作业下厨房的菜谱搜索(多个请求参数)通过抓包工具的分析发现,搜索菜谱的数据包有两个请求参数:keyword:搜索的关键字 cat:1001固定形式import requests#请求头 headers = {User-Agent:Mozilla/5.0 (Macint…

装修公司营销网站模板查询注册公司

正整数 A 的“D​A​​&#xff08;为 1 位整数&#xff09;部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​。例如&#xff1a;给定 A3862767&#xff0c;D​A​​6&#xff0c;则 A 的“6 部分”P​A​​ 是 66&#xff0c;因为 A 中有 2 个 6。 现给定 A、D​A​​…

ttkefu2026迎来永久免费的客服系统分享

ttkefu2026迎来永久免费的客服系统分享在数字化浪潮席卷全球的当下,客户服务已成为企业核心竞争力的重要组成部分。然而,传统客服系统高昂的部署成本、复杂的功能配置以及多渠道整合的痛点,始终制约着中小企业服务效…

002- 学习环境搭建

学习环境搭建1、开发工具下载 Visualstudio 2022  https://visualstugio.microsoft.com/zh-hans/vs/ 【产品链接,失效自己找和谐版本】  https://docs.microsoft.com/zh-cn/visualstudio/releases/2022/system…