1. 索引 fixed 字段不须要进行固定

留神此项是针对指针,也就是不平安代码这块

定义一个构造体

unsafe struct S {         public fixed int myFixedField[10]; }

在晚期版本的 C# 中,须要固定变量能力拜访属于 myFixedField 的整数之一。 当初,以下代码进行编译,而不将变量 p 固定到独自的 fixed 语句中:

class C {    static S s = new S();   unsafe public void M()    {                  int p = s.myFixedField[5];    } }

变量 p 拜访 myFixedField 中的一个元素。 无需申明独自的 int* 变量。 请留神,你依然须要 unsafe 上下文。 在晚期版本的 C# 中,须要申明第二个固定的指针:

class C {             static S s = new S();            unsafe public void M()     {                fixed (int* ptr = s.myFixedField){                    int p = ptr[5];                  }            }}

无关详细信息,请参阅无关 fixed 语句的文章。

2.可能会重新分配 ref 局部变量

当初,在对 ref 局部变量进行初始化后,可能会对其重新分配,以援用不同的实例。 以下代码当初编译:

ref VeryLargeStruct refLocal = ref veryLargeStruct; // 初始化refLocal = ref anotherVeryLargeStruct;              // 重新分配后,反射援用不同的存储。

3 stackalloc 数组反对初始值设定项

留神此项是针对指针,也就是不平安代码这块

当你对数组中的元素的值进行初始值设定时,你已可能指定该值:

var arr =  new int[3] {1, 2, 3};var arr2 = new int[] {1, 2, 3};

当初,可向应用 stackalloc 进行申明的数组利用同一语法:

int* pArr = stackalloc int[3] {1, 2, 3};int* pArr2 = stackalloc int[] {1, 2, 3};Span<int> arr = stackalloc [] {1, 2, 3};

4 加强的泛型束缚

当初,能够将类型 System.Enum 或 System.Delegate 指定为类型参数的基类束缚。
当初也能够应用新的 unmanaged 束缚来指定类型参数必须为“非托管类型” 。 “非托管类型” 不是援用类型,且在任何嵌套级别都不蕴含任何援用类型。
无关详细信息,请参阅无关 where 泛型束缚和类型参数的束缚的文章。
将这些束缚增加到现有类型是不兼容的更改。 封闭式泛型类型可能不再满足这些新束缚的要求。

5 元组反对 == 和 !=

C# 元组类型当初反对 == 和 !=。 无关详细信息,请参阅无关元组一文中的转换等式局部。

6.将个性增加到主动实现的属性的反对字段

当初反对此语法:

[field: SomeThingAboutFieldAttribute]public int SomeProperty { get; set; }

属性 SomeThingAboutFieldAttribute 利用于编译器生成的 SomeProperty 的反对字段。

in 办法重载解析

在增加 in 参数修饰符时,这两个办法将导致多义性:

static void M(S arg);static void M(in S arg);

小破站: https://www.bilibili.com/video/BV15o4y167uX
抖茵: https://www.douyin.com/user/self?modal_id=7207950726826364219...