原文链接: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. hashtable深度探索

    1.什么是哈希表(hashtable)?为什么要发明哈希表? 首先回答第二个问题,在之前的数据结构中我们学习了数组,链表,二叉树等数据结构,记录在结构中的相对位置是随机的,和记录的关键字之前不存在确定 ...

  2. 一条查询SQL查询语句的执行原理

    先熟悉一下浅而易懂SQL执行的流程图SQL查询过程七步曲 1.查询SQL发送请求 客户端将查询sql按照mysql通信协议传输到服务端.服务端接受到请求后,服务端单起一个线程执行sql 2.判断是否为 ...

  3. linux添加用户、权限

    # useradd –d /usr/sam -m sam 此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/usr为默认的用户主目录所在的父目录). 假 ...

  4. HttpClient连接池设置引发的一次雪崩

    事件背景 我在凤巢团队独立搭建和运维的一个高流量的推广实况系统,是通过HttpClient 调用大搜的实况服务.最近经常出现Address already in use (Bind failed)的问 ...

  5. SpringMVC(2):JSON

    一,JSON 介绍 JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效 ...

  6. Windows服务器java.exe占用CPU过高问题分析及解决

    最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...

  7. idea maven 项目 遇到 "Module not specified" 解决方法

    1. 原因:我这边出现的原因是 其他同事在提交代码是 将  这个文件夹也提交了,idea 会加载 .idea 里的配置(即 他的配置),而我的 maven 配置不同,导致出错. 2. 解决方法:删除这 ...

  8. Spring 与 SpringBoot 的区别

    概述 Spring 与 SpringBoot 有什么区别???梳理一下 Spring 和 SpringBoot 到底有什么区别,从 Spring 和 SpringBoot 两方面入手. Spring ...

  9. Mybatis通用Mapper介绍与使用

    前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQ ...

  10. 2.ElasticSearch集群的搭建

    1.创建elasticsearch-cluster文件夹,在内部复制三个elasticsearch服务 2.修改elasticsearch-cluster\node*\config\elasticse ...