C# 9.0 新特性解析
创作时间:
作者:
@小白创作中心
C# 9.0 新特性解析
引用
1
来源
1.
https://developer.aliyun.com/article/1636377
C# 9.0 是微软在2020年11月随.NET 5.0一起发布的一个重要版本,带来了许多新的特性和改进,旨在提高开发者的生产力和代码的可读性。本文将从浅入深地介绍C# 9.0的一些主要新特性,并通过代码示例来说明这些特性的使用方法和注意事项。
1. 记录类型 (Records)
1.1 概述
记录类型是一种不可变的数据结构,主要用于表示数据的值。与传统的类不同,记录类型默认是不可变的,并且提供了自动实现的相等性和哈希码计算。
1.2 代码示例
public record Person(string FirstName, string LastName);
class Program
{
static void Main(string[] args)
{
var person1 = new Person("John", "Doe");
var person2 = new Person("John", "Doe");
Console.WriteLine(person1 == person2); // 输出: True
}
}
1.3 常见问题及易错点
- 不可变性:记录类型的属性默认是只读的,不能在创建后修改。
- with 表达式:可以使用
with表达式来创建记录类型的副本,并修改其中的部分属性。
var person3 = person1 with {
LastName = "Smith" };
2. 初始化器增强 (Init Only Setters)
2.1 概述
初始化器增强允许在对象初始化时设置属性,但之后不能再修改这些属性。
2.2 代码示例
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
class Program
{
static void Main(string[] args)
{
var person = new Person {
FirstName = "John", LastName = "Doe" };
// person.FirstName = "Jane"; // 编译错误
}
}
2.3 常见问题及易错点
- 初始化时机:只能在对象初始化时设置
init属性,之后不能再修改。 - 构造函数:可以在构造函数中设置
init属性,但一旦对象创建完成,这些属性就不可再修改。
3. 顶级语句 (Top-level Statements)
3.1 概述
顶级语句允许在程序入口点直接编写代码,而不需要显式定义 Main 方法。
3.2 代码示例
using System;
Console.WriteLine("Hello, World!");
3.3 常见问题及易错点
- 单一入口点:顶级语句只能存在于一个文件中,通常用于简单的控制台应用程序。
- 复杂逻辑:对于复杂的逻辑,建议仍然使用传统的
Main方法。
4. 模式匹配增强 (Pattern Matching Enhancements)
4.1 概述
C# 9.0 对模式匹配进行了增强,引入了更多的模式类型,如关系模式和逻辑模式。
4.2 代码示例
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
var person = new Person {
Name = "John", Age = 30 };
if (person is {
Age: > 18 })
{
Console.WriteLine($"{person.Name} is an adult.");
}
if (person is {
Age: < 18 } or {
Age: > 60 })
{
Console.WriteLine($"{person.Name} is not in the working age.");
}
}
}
4.3 常见问题及易错点
- 模式组合:可以使用
and和or组合多个模式。 - 类型检查:模式匹配不仅限于属性检查,还可以用于类型检查。
5. 目标类型的新表达式 (Target-typed New Expressions)
5.1 概述
目标类型的新表达式允许省略 new 关键字后面的类型,编译器会根据上下文推断出类型。
5.2 代码示例
List<int> numbers = new() {
1, 2, 3, 4, 5 };
5.3 常见问题及易错点
- 类型推断:编译器会根据赋值的目标类型推断出
new表达式的类型。 - 适用范围:适用于集合初始化和其他需要显式指定类型的场景。
6. 属性模式 (Property Patterns)
6.1 概述
属性模式允许在模式匹配中直接访问对象的属性。
6.2 代码示例
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
var person = new Person {
Name = "John", Age = 30 };
if (person is {
Name: "John", Age: 30 })
{
Console.WriteLine("Found John Doe.");
}
}
}
6.3 常见问题及易错点
- 多属性匹配:可以同时匹配多个属性。
- 嵌套模式:支持嵌套模式匹配。
7. 空值处理 (Null-coalescing Assignment Operator)
7.1 概述
空值处理操作符 ??= 允许在变量为 null 时为其赋值。
7.2 代码示例
string name = null;
name ??= "Default";
Console.WriteLine(name); // 输出: Default
7.3 常见问题及易错点
- 短路行为:如果变量不为
null,则不会执行赋值操作。 - 性能优化:避免不必要的赋值操作,提高性能。
总结
C# 9.0 引入了许多新的特性和改进,旨在提高开发者的生产力和代码的可读性。通过本文的介绍,希望读者能够对这些新特性有一个基本的了解,并在实际开发中合理利用它们。当然,每个特性都有其适用场景和注意事项,开发者在使用时应结合具体需求进行选择和应用。
热门推荐
关于香榧药食同源价值的研究与探索
云端之下,隐私至上:从云输入法安全危机透视鸿蒙守护之道
直肠癌术后为何需要定期肠镜复查?专家详解四大必要性
汽车综合油耗解析,影响油耗的关键因素及优化策略
法律与道德:社会秩序的双子基石及其微妙差异
成长的烦恼:如何帮助孩子应对青春期的挑战
钻石都能人工合成了,黄金能吗?
金属活动顺序表中还原性怎样比较
如何规划提前还贷策略?这些还贷方案如何优化财务状况?
AI Agent智能体全景技术图与架构设计:智能体自主性与智能性的双重提升
《鬼灭之刃》童磨角色详解:上弦之贰的冰之鬼
婚姻咨询师的十大痛点与解决方案,全在这了!
CPU基本时钟与加速时钟区别是什么,追求哪个更好?
企业接受虚开发票 不同情况面临不同后果
决明子:明目降压的神奇小种子
欧洲能源危机加剧,能否再次托起中国光伏?
冬季泳池设备运行与维护注意事项
高度近视患者一定要定期进行眼底三面镜检查!
荔枝品种及特点、口味详细介绍
耙耙柑挑选指南:从外观到口感,全面解析如何选购优质水果?
八字日柱命局分析:如何预测配偶特征
直播带货如何保持内容创新,提高用户黏性的创意玩法
大年初一这么吃才吉祥?6道寓意吉祥如意的菜谱,错过可惜!
广东开展复工复产指导服务工作,助企业排隐患保平安
“央视双子星”董卿和周涛,离开央视多年,走上了截然不同的道路
如何分析影响上证指数的因素?这些因素如何作用于指数变化?
交易所政策齐出,ESG信息披露体系逐步成型
又让车主寒心了?客服辱骂车主,哪吒汽车还能“翻身”吗?
金秀贤给CP粉的温馨提醒:《眼泪女王》只是戏,别当真!
民国四大情书精选美句:朱湘、徐志摩、鲁迅、沈从文的情书世界