探索C# 10.0的关键新特性

2024-06-06 01:04

本文主要是介绍探索C# 10.0的关键新特性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

随着.NET 6的发布,C# 10.0带来了许多创新特性和改进,旨在简化编码过程,增强开发者的生产力,并提供更现代、简洁的编程体验,可以说,这些新特性不仅增强了C#的表达能力,还提高了开发者的编程效率和代码的可读性,让C#更加通俗易懂。接下来,将逐一探讨并举例说明这些关键新特性。

1. 全局 using 语句

全局using语句允许开发者在项目级别导入命名空间,从而在整个项目中无需在每个文件顶部显式声明。这有助于减少冗余和提高代码可读性。比如global using,只要全局引入了对应的项目文件,可以在任何类或方法中直接使用,无需单独import。这有点像Java引入包名,整个类无需在导入,直接使用。


global using System.Net.Http;public class MyClass {public async Task<string> FetchDataAsync() {var client = new HttpClient();// ...}}

2. 文件作用域命名空间

在 C# 10 之前,通常会按照如下方式声明一个命名空间,然后类定义在{}里面。

namespace MyNamespace {// 命名空间成员的定义
}

这种方式的缺点是:如果我们想把一个文件中的所有代码都置于同一个命名空间中,就必须在每个声明中都写出完整的命名空间前缀,如:

namespace MyNamespace {class MyClass {// 类的定义}enum MyEnum {// 枚举类型的定义}
}

如果文件中的成员较多,这样的写法显得很冗长。而且,如果我们想要把这些成员移到另一个命名空间中,也需要逐一修改所有声明中的命名空间前缀,比较麻烦。

C# 10引入了文件作用域命名空间,这样就可以在文件中定义命名空间,就不需要在每个文件中都包含相同的命名空间声明。只要在文件顶部,使用分号 ;结束,所有的类就归属到这个命名空间。其实就是Java中包名,每个类都归属自己包下,这样使得增强可读、可维护性。

namespace MyProject.MyNamespace;public class MyClass {}

3. Top-level statements(顶级语句)

对于简单的控制台应用或脚本,可以省略主类并将程序入口点的代码直接写在文件顶部,无需定义Program类,无需像之前输出需要定义main方法

class Program {static void Main(string[] args) {        Console.WriteLine("Hello, World!");}}

可以看到,使用 Top-level Statements,不需要定义命名空间、类、Main 函数等。代码更加简洁明了,不需要冗余的代码

using System;Console.WriteLine("Hello, World!");

优点

  • 简化代码:Top-level Statements 可以减少应用程序中冗余的代码,使代码更加简洁明了。
  • 提高开发效率:使用 Top-level Statements 可以减少应用程序的开发时间,提高开发效率。

缺点

  • 可读性差:Top-level Statements 中不能定义类或函数,可能会影响代码的可读性和可维护性。
  • 不利于代码重构:Top-level Statements 中定义的变量无法被其他函数或类使用,可能会影响代码的重构

4. Init-only properties(初始化只读属性)

Init-only 属性使得在对象创建时可以赋值,但一旦创建完成就无法更改,比如 person.FirstName = “Jane”; 这将导致编译错误,因为init-only属性不能再被修改。

using System;namespace CSharp10
{class Program{static void Main(string[] args){var person = new Person(firstName: "John", lastName: "Doe");Console.WriteLine($"First Name: {person.FirstName}, Last Name: {person.LastName}");}}public record Person{public string FirstName { get; init; }public string LastName { get; init; }public Person(string firstName, string lastName){FirstName = firstName;LastName = lastName;}}
}

5. Target-typed new expressions(目标类型new表达式)

编译器现在可以根据变量的目标类型推断构造函数参数类型。在 C# 10.0 之前,如果我们要创建一个对象,需要明确指定类型,比如创建一个名为 person 的 Person 类型的对象


Person person = new Person();

而在 C# 10.0 中,我们可以这样写,使用 Target-typed new 表达式创建一个名为 person 的 Person 类型的对象


Person person = new();

可以看到,在使用 Target-typed new 表达式时,我们省略了类型名 Person,而是在 new 后面直接使用了目标类型 Person,编译器会自动推断出类型。

6. Constant interpolated strings(常量插值字符串)

常量插值就是允许在常量字符串中使用字符串插值,这在之前的 C# 版本中是不允许的。常量插值的语法和字符串插值的语法类似,但是占位符必须是常量字符串。通俗来讲,就是常量里面,某个字段可变。比如

const string Name = "John";
const string Greeting = $"Hello, {Name}!";
Console.WriteLine(Greeting); // 输出:Hello, John!

在上面的示例中,我们定义了一个常量字符串 Name 和一个使用字符串插值初始化的常量字符串 Greeting,其中占位符 Name 是一个常量字符串。

总结

其实C# 10.0还有很多新特性,以上只是C# 10.0部分重要新特性的一部分,此外还包括对可空引用类型的进一步改进、record structs等,所有这些新功能都使C#语言更加现代化和易用,感兴趣的可以通过更新到最新版本的.NET SDK来充分利用这些新特性,提升开发效率和代码质量。

这篇关于探索C# 10.0的关键新特性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034674

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

算法与数据结构面试宝典——回溯算法详解(C#,C++)

文章目录 1. 回溯算法的定义及应用场景2. 回溯算法的基本思想3. 递推关系式与回溯算法的建立4. 状态转移方法5. 边界条件与结束条件6. 算法的具体实现过程7. 回溯算法在C#,C++中的实际应用案例C#示例C++示例 8. 总结回溯算法的主要特点与应用价值 回溯算法是一种通过尝试各种可能的组合来找到所有解的算法。这种算法通常用于解决组合问题,如排列、组合、棋盘游

最新版本的JDK安装和配置(Java SE 10.0.2)

1.废话少说,要么百度JDK,要么直接点传送门http://www.oracle.com/technetwork/java/javase/downloads/index.html。这里需要说的JDK包含JRE,打个比方,JDK就是厨房,包含各种工具,而JRE是运行环境,就是锅。所以下载的话,直接下载最新JDK最好。然后根据你的系统位数选择版本。我的是64bit. 2.点击1的右边中间的【JD

C# 命名管道中客户端访问服务器时,出现“对路径的访问被拒绝”

先还原一下我出现错误的情景:我用C#控制台写了一个命名管道服务器,然后用ASP.NET写了一个客户端访问服务器,运行之后出现了下面的错误: 原因:服务器端的访问权限不够,所以是服务器端的问题,需要增加访问权限。(网上很多都说是文件夹的权限不够,情况不同,不适用于我这种情况) 解决办法: (1)在服务器端相应地方添加以下代码。 PipeSecurity pse = new PipeSec

如何通过示例将旧版 C# 转换为 C# 12

随着 C# 的不断发展,每个新版本都会引入强大的新功能,从而提高语言的功能和可读性。通过从旧版本的 C# 迁移到 C# 12,您可以获得更高效、更易于维护和更具表现力的代码。 由于代码库遗留、公司限制以及对旧语言功能的熟悉,许多开发人员仍在使用旧版本的 C#。升级似乎很困难,但现代版本的 C# 具有显著的优势,例如更好的性能、增强的功能和更高的安全性。 通过增量重构、试点项目和团队培训逐步