C# 10语言的新增特性

posted at 2024.3.6 12:07 by Administrator

    2021年11月8日,微软正式发布了 C# 10, 主要新增了常见场景所需代码量最小化、Struct、Lambda 扩展、支持泛型的特性。具体介绍如下:

    一、命名空间的全局和隐式使用

    现有的using指令是写在.cs头部,指定引用的命名空间。C# 10 引入了一个新的Global using指令和Implicit using指令以减少在每个文件顶部指定的使用次数。

    如果关键字global出现在using指令之前,则该 using 适用于整个项目:

      global using System;

目前using指令的任何功能都可以照样使用。

隐式Implicit using指令

隐式 using 功能会自动为您正在构建的项目类型添加常用的global using。

要启用隐式使用,在项目文件.csproj中设置以下属性

<PropertyGroup>
<!-- Other properties like OutputType and TargetFramework -->
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

    二、命名空间写成语句

    从 C# 10 开始,可以将文件范围的命名空间写成语句,后跟分号且不使用大括号:

namespace YongChui.Seeng;
class CoolClass      // Note: no indentation
{ ... }

三、常量字符串内插

你可以给 const string 使用字符串插值了,非常方便,例如:

Const string dx="hello,world";
Const string dy=$"{dx},cite";

四、起用记录结构类型

解决了 record 只能给 class 而不能给 struct 用的问题,用 record 定义 struct 的好处其实有很多,

你无需重写 GetHashCode 和 Equals 之类的方法了。例如:

Record struct Novaengr(int Age,int Weght);

五、Struct扩展

C# 10 增加了struct的特性,可让结构和类之间有更好的一致性。

这些新功能包括parameterless constructors、field initializers、record structs和with表达式。

    1、在 C# 10 之前,每个结构体都有一个隐式公共无参数构造函数,用来将结构体的字段设置为default. 导致不能像class那样, 为struct上创建无参数构造函数。

    C# 10 允许在struct上创建无参数结构构造函数。不过必须是public, 而且不能是partial:

public struct WindCity
{
    public WindCity ()
    {
        City = "JinXiang";
    }
    public string City { get; init; }
}

    2、不仅可以在无参数构造函数中初始化字段,也可以通过字段或属性初始化程序初始化它们:

public struct WindCity
{
    public string City { get; init; } = " JinXiang ";
}

    3、记录类中的ToString()前增加了sealed修饰符

    从 C# 10 开始,该方法可以包含 Sealed 修饰符,用来阻止编译器为任何派生记录实现一个合成的ToString()方法。

    4、结构支持with 表达式

    C# 10 中,所有结构,包括记录结构以及匿名类型都支持了with表达式:

var andren = ren with { LastName = "Kristensen" };

    这将返回一个具有新值的新实例。可以更新任意数量的值。未设置的值将保留与初始实例相同的值。

    六、Lambda 扩展

    1. 支持 attributes

    lambda 可以带 attribute 了:

df = [Ying] (dx) => dx; // 给 lambda 设置
df = [return: Ying] (dx) => dx; // 给 lambda 返回值设置
df = ([Ying] dx) => dx; // 给 lambda 参数设置

2. 支持指定返回值类型

此前 C# 的 lambda 返回值类型靠推导,C# 10 开始允许在参数列表最前面显示指定 lambda 类型了:

dy= int () => 4;

    3. 支持 ref 、in 、out 等修饰

dy = ref int (ref int dx) => ref dx; // 返回一个参数的引用

    4. 头等函数

    函数可以隐式转换到 delegate,于是函数上升至头等函数:

void Ying() { Console.WriteLine("hello"); }
var dx = Ying;
dx(); // hello

5. 自然委托类型

lambda 现在会自动创建自然委托类型,于是不再需要写出类型了。

var df = () => 1;   // Func<int>
var dg = string (int dx, string dy) => $"{dy}{dx}";  // Func<int, string, string>
var dh = "test".GetHashCode;  // Func<int>

七、attribute支持泛型

是的你没有看错,C# 的 attributes 支持泛型了,不过 .NET 6 中将以预览特定放出,因此需要

 <LangVersion>preview</LangVersion>:
 
class ChinaAttribute<T> : Attribute
{
    public T Data { get; }
    public ChinaAttribute(T data) { Data = data; }
}

然后你就能这么用了:

[China<int>(3)]
[China<float>(4.5f)]
[China<string>("hello")]

八、其他增强

1、tuple 支持混合定义和使用

2、接口支持抽象静态方法

3、允许在方法上指定 AsyncMethodBuilder

    C# 10 将允许方法上使用 [AsyncMethodBuilder(...)] 来使用你

自己实现的 async method builder,代替自带的 Task 或者 ValueTask 的异步方法构造器。

    4、增强的 #line pragma

 

 

 

Tags: , , , , , , ,

IT技术

添加评论

  Country flag

biuquote
  • 评论
  • 在线预览
Loading