13 个 C# 10 特性

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13 个 C# 10 特性相关的知识,希望对你有一定的参考价值。

常量的内插字符串

C# 10 允许使用在常量字符串初始化中使用插值, 如下

const string name = "Oleg";
const string greeting = $"Hello, name.";

Console.WriteLine(greeting);
// Output: Hello, Oleg.

扩展属性模式

从 C# 10 开始,您可以在适当的模式中引用嵌套的属性或字段, 属性模式变得更具可读性并且需要更少的大括号。

Person person = new()

    Name = "Oleg",
    Location = new()  Country = "PL" 
;

if (person is  Name: "Oleg", Location.Country: "PL" )

    Console.WriteLine("It's me!");


class Person

    public string Name  get; set; 
    public Location Location  get; set; 


class Location

    public string Country  get; set; 

如果Location为null,则不会匹配模式并返回false。

文件范围的命名空间

C# 10 引入了一种新的命名空间声明方式 - 文件范围的命名空间,减少一个大括号,代码结构更简洁。

namespace FileScopedNamespace;

class Program

    static void Main(string[] args)
    
        Console.WriteLine("Hello World!");
    

全局 Using

一次引用,全局通用

global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;

List<int> list = new()  1, 2, 3, 4 ;
int sum = list.Sum();
Console.WriteLine(sum);

await Task.Delay(1000);

同一个解构中的赋值和声明

C# 10 可以在同一个解构中进行赋值和声明。

var rgb = (255, 100, 30);

// Initialization & assignment
int r;
(r, int g, int b) = rgb;

Console.WriteLine($"RGB: r, g, b");
// Output: RGB: 255, 100, 30

Record 类型重写 ToString() 时支持密封

Product product = new()  Name = "Bread" ;
Console.WriteLine(product.ToString());
// Output: Bread

public record Product

    public string Name  get; init; 

    public sealed override string ToString()
    
        return Name;
    

Record Struct

C# 10 支持 record struct

Person me = new()  FirstName = "Oleg", LastName = "Kyrylchuk" ;

Console.WriteLine(me);
// Output: Person  FirstName = Oleg, LastName = Kyrylchuk 

Person otherPerson = me with  FirstName = "John" ;
Console.WriteLine(otherPerson);
// Output: Person  FirstName = John, LastName = Kyrylchuk 

Person anotherMe = new()  FirstName = "Oleg", LastName = "Kyrylchuk" ;
C onsole.WriteLine(me == anotherMe);
// Output: True

record struct Person

    public string FirstName  get; init; 
    public string LastName  get; init; 


record struct Product(string Name, decimal Price);

 

Struct 字段支持初始化

using System;

Person person = new()  Name = "Oleg" ;

Console.WriteLine(person.Id + " " + person.Name);
// Output: 0cc6caac-d061-4f46-9301-c7cc2a012e47 Oleg

struct Person

    public Guid Id  get; init;  = Guid.NewGuid();
    public string Name  get; set; 


Lambda 表达式的 Attributes 支持

C# 9 支持本地函数的 Attributes, C# 10 添加了 Lambda 表达式的 Attributes 支持。

Action a = [MyAttribute] () =>  ;                
Action<int> b =[return: MyAttribute] (x) =>  ;  
Action<int> c =[MyAttribute] ([MyAttribute] x) =>  ;       


class MyAttribute : Attribute
 

Lambda 中的显式返回类型

Test<int>();

var l1 = string () => string.Empty;
var l2 = int () => 0;
var l3 = static void () =>  ;

void Test<T>()

    var l4 = T () => default;


应用于方法的 AsyncMethodBuilder 特性

从 C# 7 开始,您只能将AsyncMethodBuilder 特性应用于类型, 在 C# 10 中,您还可以将该特性应用于单个方法。

using System.Runtime.CompilerServices;

class Example

    [AsyncMethodBuilder(typeof(AsyncVoidMethodBuilder))]
    public void ExampleMethod()
    
    


结构体中的表达式

C# 10 支持 将 with 表达式和 struct 一起使用

Product potato = new()  Name = "Potato", Category = "Vegetable" ;
Console.WriteLine($"potato.Name potato.Category");
// Output: Potato Vegetable

Product tomato = potato with  Name = "Tomato" ;
Console.WriteLine($"tomato.Name tomato.Category");
// Output: Tomato Vegetable

struct Product

    public string Name  get; set; 
    public string Category  get; set; 


 匿名类型中的表达式

C# 10 支持 将 with 表达式和匿名类型一起使用

var potato = new  Name = "Potato", Category = "Vegetable" ;
Console.WriteLine($"potato.Name potato.Category");
// Output: Potato Vegetable

var onion = potato with  Name = "Onion" ;
Console.WriteLine($"onion.Name onion.Category");
// Output: Onion Vegetable

全文完.....

以上是关于13 个 C# 10 特性的主要内容,如果未能解决你的问题,请参考以下文章

说说 C# 9 新特性的实际运用

VSCode 必装的 10 个高效开发插件;JDK 13 中将增加文本块特性;百度 HTTPS 部署实践

Python2即将淘汰,分享python3 才能用的特性(13个)

C# 10 完整特性介绍

C# 10 新特性 —— Lambda 优化

C# 10 新特性 —— 命名空间的变化