C# 中 System.Index 结构体和 Hat 运算符(^)的全新用法

翻译自 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
译者 : 技术译民
出品 : 技术译站
连接 : 英文原文


  1. http://www.javashuo.com/article/p-ugffgfep-nu.html "System.Range 结构体" ↩︎

相关文章
相关标签/搜索