随着.NET 6的发布,C# 10.0带来了许多创新特性和改进,旨在简化编码过程,增强开发者的生产力,并提供更现代、简洁的编程体验,可以说,这些新特性不仅增强了C#的表达能力,还提高了开发者的编程效率和代码的可读性,让C#更加通俗易懂。接下来,将逐一探讨并举例说明这些关键新特性。
全局using语句允许开发者在项目级别导入命名空间,从而在整个项目中无需在每个文件顶部显式声明。这有助于减少冗余和提高代码可读性。比如global using,只要全局引入了对应的项目文件,可以在任何类或方法中直接使用,无需单独import。这有点像Java引入包名,整个类无需在导入,直接使用。
global using System.Net.Http;
public class MyClass {
public async Task<string> FetchDataAsync() {
var client = new HttpClient();
// ...
}
}
在 C# 10 之前,通常会按照如下方式声明一个命名空间,然后类定义在{}里面。
namespace MyNamespace {
// 命名空间成员的定义
}
这种方式的缺点是:如果我们想把一个文件中的所有代码都置于同一个命名空间中,就必须在每个声明中都写出完整的命名空间前缀,如:
namespace MyNamespace {
class MyClass {
// 类的定义
}
enum MyEnum {
// 枚举类型的定义
}
}
如果文件中的成员较多,这样的写法显得很冗长。而且,如果我们想要把这些成员移到另一个命名空间中,也需要逐一修改所有声明中的命名空间前缀,比较麻烦。
C# 10引入了文件作用域命名空间,这样就可以在文件中定义命名空间,就不需要在每个文件中都包含相同的命名空间声明。只要在文件顶部,使用分号 ;结束,所有的类就归属到这个命名空间。其实就是Java中包名,每个类都归属自己包下,这样使得增强可读、可维护性。
namespace MyProject.MyNamespace;
public class MyClass {
}
对于简单的控制台应用或脚本,可以省略主类并将程序入口点的代码直接写在文件顶部,无需定义Program类,无需像之前输出需要定义main方法
class Program {
static void Main(string[] args) {
Console.WriteLine("Hello, World!");
}
}
可以看到,使用 Top-level Statements,不需要定义命名空间、类、Main 函数等。代码更加简洁明了,不需要冗余的代码
using System;
Console.WriteLine("Hello, World!");
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;
}
}
}
编译器现在可以根据变量的目标类型推断构造函数参数类型。在 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
,编译器会自动推断出类型。
常量插值就是允许在常量字符串中使用字符串插值,这在之前的 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来充分利用这些新特性,提升开发效率和代码质量。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。