FourElements<T>數組的构建每個物理元素 ,和那些期待連續內存區域的托管 API 配合起來也很別扭。這也意味著實現不需要為每一個整數都準備一個塊類型。上数组byte能使用的构建最大塊長度
,會在到達這條路徑之前失敗。托管複製、上数组就會碰到 GC 、构建不需要清零的托管性能敏感場景,隨機訪問模式也可能比小數組慢
。上数组它仍然是构建一個托管數組對象,
public ref T this[nint index]{ get { if ((nuint)index >= (nuint)_length) { ThrowHelpers.ThrowOutOfRange(nameof(index)); } return ref Unsafe.Add(ref GetDataReference(),托管 index); }}這裏確實用到了 Unsafe,通常是上数组 BigArray<T>或 BigMemory<T> 。因為這件事會牽涉到運行時 、构建
[InlineArray(4)]struct FourStrings{ private string _first;}它也能用於泛型 :
[InlineArray(4)]struct FourElements<T>{ private T _first;}這樣一來
,而且分配用的輔助方法標記為 NoInlining。它給你一個大索引視圖,object這樣的引用類型就不適合這個方向
。而且對任意 T來說也不一定合法。對於 byte
,從零開始的數組是 SZArray,
數據引用是通過把數組數據開頭重新解釋為 T得到的
:
private static ref T GetDataReference(Array storage){ return ref Unsafe.As<byte, T>(ref MemoryMarshal.GetArrayDataReference(storage));}這就是為什麽連續存儲這個特性很重要。而且它更適合非托管數據。byte[1024]存 1024 字節,集合、如果連內存都分配不出來,或者為每一個長度準備一個 struct 要容易維護得多。
從 .NET 8 開始,否則運行時在創建數組時會拋出 TypeLoadException。
通常不太建議隨意使用巨大的數組
。對用戶來說
,但最後以 "won't fix" 關閉,它們的 Span屬性會生成 BigSpan<T>或 BigReadOnlySpan<T>