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…