C# 8.0 添加和增強的功能【基礎篇】( 四 )


List<int> numbers = null;int? i = null;numbers ??= new List<int>();numbers.Add(i ??= 17);numbers.Add(i ??= 20);Console.WriteLine(string.Join(" ", numbers));// output: 17 17Console.WriteLine(i);// output: 17十二、非托管構造類型在 C# 7.3 及更低版本中,構造類型(包含至少一個類型參數的類型)不能為非托管類型 。從 C# 8.0 開始,如果構造的值類型僅包含非托管類型的字段,則該類型不受管理 。
public struct Coords<T>{public T X;public T Y;}// Coords<int> 類型為 C# 8.0 及更高版本中的非托管類型// 與任何非托管類型一樣,可以創建指向此類型的變量的指針,或針對此類型的實例在堆棧上分配內存塊Span<Coords<int>> coordinates = stackalloc[]{new Coords<int> { X = 0, Y = 0 },new Coords<int> { X = 0, Y = 3 },new Coords<int> { X = 4, Y = 0 }};Span 簡介
??在定義中,Span 就是一個簡單的值類型 。它真正的價值,在于允許我們與任何類型的連續內存一起工作 。
??在使用中,Span 確保了內存和數據安全 , 而且幾乎沒有開銷 。
??要使用 Span , 需要設置開發語言為 C# 7.2 以上,并引用System.Memory到項目 。
??Span 使用時,最簡單的,可以把它想象成一個數組,有一個Length屬性和一個允許讀寫的index 。
// 常用的一些定義、屬性和方法Span(T[] array);Span(T[] array, int startIndex);Span(T[] array, int startIndex, int length);unsafe Span(void* memory, int length);int Length { get; }ref T this[int index] { get; set; }Span<T> Slice(int start);Span<T> Slice(int start, int length);void Clear();void Fill(T value);void CopyTo(Span<T> destination);bool TryCopyTo(Span<T> destination);// 從 T[] 到 Span 的隱式轉換char[] array = new char[] { 'i', 'm', 'p', 'l', 'i', 'c', 'i', 't' };Span<char> fromArray = array;// 復制內存int Parse(ReadOnlySpan<char> anyMemory);int Copy<T>(ReadOnlySpan<T> source, Span<T> destination);??

推薦閱讀