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&showTab=post