C#12为.Net8添加的新功能内联数组

前言

前几天发布了.Net8 preview6,配合C#12,它这里有个比较实用的新功能,就是通过内联数组特性初始化数组长度和类型,本篇来看下。

概括

1.常规
常规的实例化一个数组一般的都是,比如以下函数.

int [] inlineArray = new int[10];InlineArrayAccess1(inlineArray)
调用
private static void InlineArrayAccess1(int[] inlineArray ){    for (int i = 0; i < 10; i++)    {        inlineArray[i] = i * i;    }     foreach (int i in inlineArray)     {        Console.WriteLine(i);     }}

实例化10长度的Int数组inlineArray,一般都是new然后赋值。

2.C#12

以下代码需要最新的vs和最新的.net8

在C#12里面你可以这样,先申请一个10长度的T泛型

[System.Runtime.CompilerServices.InlineArray(10)]public struct Buffer10<T>{     private T _element0;}或者[System.Runtime.CompilerServices.InlineArray(10)]public struct Buffer{    private int _element0;}

可以看到它通过特性InlineArray来标记,参数10为申请了10长度,T是指泛型,可以任何类型。

用的时候只需要

new Buffer<int> inlineArray=new Buffer<int>();或者var inlineArray= new Buffer();调用InlineArrayAccess(inlineArray);

然后inlineArray实例作为参数传递下面函数

private static void InlineArrayAccess(Buffer10<int> inlineArray){     for (int i = 0; i < 10; i++)     {         inlineArray[i] = i * i;     }     foreach (int i in inlineArray)     {         Console.WriteLine(i);     }}

这里是申请了一个int为10长度的数组。那么也可以申请string为10长度的,因为T是泛型,意指任何类型。

private static void InlineArrayAccess(Buffer10<string> inlineArray){   for (int i = 0; i < 10; i++)   {       inlineArray[i] = i * i;   }   foreach (int i in inlineArray)   {       Console.WriteLine(i);   }}

3.总结

它这里的InlineArrayAttribute这个特性,实际上把泛型和数组的长度都提权出来了,不必要的受制于代码片段特定的类型和特定的初始化长度。