翻譯自 John Demetriou 2019年2月17日 的文章 《C# 8 – Introducing Index Struct And A Brand New Usage For The Hat Operator》html
今天咱們要講的是 Hat 運算符(^
)。目前爲止,Hat 運算符(^
)已經被用做布爾類型的異或運算符,以及字節、整型類型的按位異或運算符。在 C# 8 中,它有一個新的用法。git
這個運算符的新用法是自動建立 Index
結構體的實例。那什麼是 Index
結構呢?這在 C# 8 中也有介紹。
Index
結構體的代碼(就像全部的 C# 代碼同樣)能夠在 github 上找到。你能夠看到,它是一個至關簡單的結構體,包含一個整數值,和一個定義是否應該從末尾開始計數的布爾值。
它有助於讓訪問數組比以往容易不少。咱們能夠很輕鬆地將這個值存儲在一個 Index
類型中來代替一個整數,它比一個簡單的整數更清楚地定義了咱們的意圖,並有助於避免該變量的誤用。github
到目前爲止,當嘗試訪問數組中特定索引處的值時,咱們老是從第一個元素開始考慮。那麼 Hat 運算符(^
)是如何幫助咱們的呢?例如,若是你想獲取一個已知大小的數組的最後一個元素,你一般會從數組的 Length 中減去 1,並在檢索時使用這個技巧或硬編碼的數字。數組
例如:函數
int[] array = new int[] { 1, 3, 5, 7, 9 }; var x = array[4];
你能夠像下面的例子同樣使用數組提供的變量:編碼
int[] array = new int[] { 1, 3, 5, 7, 9 }; var x = array[array.Length - 1];
這種方法也能夠用於編譯時長度未知的數組。而且這一般是首選方法,由於它代表您但願更容易地檢索最後一項,而不是必須進行計數來查看哪一個是第四項並驗證它是最後一項。翻譯
適當的使用 Index
結構,咱們能夠很容易地建立一個索引值類型,這樣咱們就能夠存儲它並隨心地重用它,以免違反 DRY 原則。設計
Index lastItem = new Index(4, false); int[] array = new int[] { 1, 3, 5, 7, 9 }; var x = array[lastItem];
譯者注:
DRY 是 「Don't repeat yourself」 的縮寫,是軟件開發的一個原則,旨在減小軟件模式的重複,用抽象來替代它,或者使用數據規範化來避免冗餘。也就是說,在一個設計裏,對於任何東西,都應該有且只有一個表示,其它的地方都應該引用這一處。這樣須要改動的時候,只需調整這一處,全部的地方就都變動過來了。code
但正如咱們所看到的,咱們還可使用 fromEnd 參數來更好地表達咱們但願檢索最後一項,並在編譯時從一個大小未知的數組中檢索最後一項。htm
Index lastItem = new Index(1, true); int[] array = new int[] { 1, 3, 5, 7, 9 }; var x = array[lastItem];
不過,咱們須要記住的一點是,當從末尾開始計數時,不是以 0 開始的索引。把它想象成咱們使用的 Length - x
,其中 x
就是咱們在 Index
結構體構造函數中使用的值。
可是 Hat 運算符(^
)在這一切中有何用武之地呢?唔,Hat 運算符(^
) 是調用 Index
結構體時將 fromEnd 設置爲 true 的簡寫方式。
好比,下面的兩行是徹底相同的:
Index lastItem = new Index(1, true); // line 1 int[] array = new int[] { 1, 3, 5, 7, 9 }; var x = array[lastItem]; Index lastItem = ^1; //line 2, 同 line 1 int[] array = new int[] { 1, 3, 5, 7, 9 }; var x = array[lastItem];
或者,若是你想要檢索倒數第二項,你能夠這麼作:
Index secondToLast = new Index(2, true); int[] array = new int[] { 1, 3, 5, 7, 9 }; var x = array[secondToLast]; Index secondToLast = ^2; int[] array = new int[] { 1, 3, 5, 7, 9 }; var x = array[secondToLast];
就這樣,一個新的結構體類型和一箇舊運算符(^
)的新用法打包在一塊兒了。
System.Index
結構體,與 System.Range
結構體[1]是攜手並進的,您能夠點擊這裏查看。
做者 : John Demetriou
譯者 : 技術譯民
出品 : 技術譯站
連接 : 英文原文
http://www.javashuo.com/article/p-ugffgfep-nu.html "System.Range
結構體" ↩︎