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