原文链接:https://blog.okyrylchuk.dev

原文作者:Oleg Kyrylchuk

译: 等天黑

常量的内插字符串

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 特性的更多相关文章

  1. 使用FROM确认按钮(键盘13号键)提交特性并使用ajax.POST提交.

    如果又想使用FROM确认按钮(键盘13号键)提交特性  还能继续用AJAX.POST提交.就需要使用return false 来阻止FROM默认提交 代码如下: HTML页面 这里最关键就是用了ret ...

  2. Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)

    Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database U ...

  3. MIT 6.828 JOS学习笔记13 Exercise 1.10

    Lab 1 Exercise 10 为了能够更好的了解在x86上的C程序调用过程的细节,我们首先找到在obj/kern/kern.asm中test_backtrace子程序的地址, 设置断点,并且探讨 ...

  4. ML.NET 0.10特性简介

    IDataView被单独作为一个类库包 IDataView组件为表格式数据提供了非常高效的处理方式,尤其是用于机器学习和高级分析应用.它被设计为可以高效地处理高维数据和大型数据集.并且也适合处理属于更 ...

  5. ActiveMQ学习笔记(13)----Destination高级特性(一)

    1. Wildcards 1. Wildcards用来支持名字分层体系,它不是JMS规范的一部分,是ActiveMQ的扩展. ActiveMQ支持一下三种wildcards: 1. ".&q ...

  6. dbt 0.13.0 新添加特性sources 试用

    dbt 0.13 添加了一个新的功能sources 我呢可以用来做以下事情 从基础模型的源表中进行数据选择 测试对于源数据的假设 计算源数据的freshness source 操作 定义source ...

  7. 第13月第10天 swift3.0

    1. Type 'Any' has no subscript members 这一条简直莫名其妙.大体意思就是,你这个类型"Any"不是个数组或者字典,不能按照下标取东西. 我之前 ...

  8. mysql 8.0.13 zip windows 10安装

    1.下载安装包 https://dev.mysql.com/downloads/mysql/ 下载后解压到D:\Program Files\mysql-8.0.13-winx64 2.添加配置文件my ...

  9. spark2.0的10个特性介绍

    1. Spark 2.0 ! 还记得我们的第七篇 Spark 博文里吗?里面我用三点来总结 spark dataframe 的好处: 当时是主要介绍 spark 里的 dataframe,今天是想总结 ...

随机推荐

  1. Learning Spark中文版--第三章--RDD编程(2)

    Common Transformations and Actions   本章中,我们浏览了Spark中大多数常见的transformation(转换)和action(开工).在包含特定数据类型的RD ...

  2. 写一个简单的AIDL

    1.首先创建一个AIDL文件,并添加上两个接口.IMyAidlInterface.aidlpackage com.example.broadcastdemo;// Declare any non-de ...

  3. mybatis-plus分页记坑

    mapper接口方法返回IPage,如果不传page会报npe,底层assert page!=null有啥用?

  4. SpringBoot java配置类@Configuration 的两种写法

    首先在Springboot项目中,件一个java类,使用注解@Configuration  ,则这个类是SpringBoot bean的创建的配置文件类,,这种配置文件类有两种写法 1.使用包扫描 , ...

  5. 【Linux】【Basis】文件

    refer to: https://en.wikipedia.org/wiki/POSIX refer to: https://en.wikipedia.org/wiki/Unix_file_type ...

  6. shell脚本下载网页图片

    和大家分享一个shell脚本写的图片抓取器.使用方法:img_downloader.sh.使用时在shell下输入:./img_downloader.sh www.baidu.com -d image ...

  7. 前端两大框架 vue 和 react 的区别

    1. 设计思想 vue: vue的官网介绍说vue是一种渐进式框架,采用自底向上增量开发的设计: react: 采用函数式编程,推崇纯组件,数据不可变,单向数据流: 2. 编写语法 vue: 采用单文 ...

  8. ES在项目中的测试

    1.application.yml server: port: ${port:40100}spring: application: name: xc-search-servicexuecheng: e ...

  9. 创建线程的第二种方式------实现Runnable接口的方式

    package cn.itcast.demo16.Demo07.Runnable;/** * @author newcityman * @date 2019/7/22 - 23:17 */public ...

  10. [源码解析] PyTorch分布式优化器(3)---- 模型并行

    [源码解析] PyTorch分布式优化器(3)---- 模型并行 目录 [源码解析] PyTorch分布式优化器(3)---- 模型并行 0x00 摘要 0x01 前文回顾 0x02 单机模型 2.1 ...