C# 7.3 新增功能

2023-04-07  本文已影响0人  程序员ken

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

上一篇 下一篇

猜你喜欢

热点阅读