前言
前几天发布了.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这个特性,实际上把泛型和数组的长度都提权出来了,不必要的受制于代码片段特定的类型和特定的初始化长度。