C# 中 System.Index 结构体和 Hat 运算符(^)的全新用法
翻译自 John Demetriou 2019年2月17日 的文章 《C# 8 – Introducing Index Struct And A Brand New Usage For The Hat Operator》
今天我们要讲的是 Hat 运算符(^)。目前为止,Hat 运算符(^)已经被用作布尔类型的异或运算符,以及字节、整型类型的按位异或运算符。在 C# 8 中,它有一个新的用法。
这个运算符的新用法是自动创建 Index 结构体的实例。那什么是 Index 结构呢?这在 C# 8 中也有介绍。
Index 结构体的代码(就像所有的 C# 代码一样)可以在 github 上找到。你可以看到,它是一个相当简单的结构体,包含一个整数值,和一个定义是否应该从末尾开始计数的布尔值。
它有助于让访问数组比以往容易很多。我们可以很轻松地将这个值存储在一个 Index 类型中来代替一个整数,它比一个简单的整数更清楚地定义了我们的意图,并有助于避免该变量的误用。
到目前为止,当尝试访问数组中特定索引处的值时,我们总是从第一个元素开始考虑。那么 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” 的缩写,是软件开发的一个原则,旨在减少软件模式的重复,用抽象来替代它,或者使用数据规范化来避免冗余。也就是说,在一个设计里,对于任何东西,都应该有且只有一个表示,其它的地方都应该引用这一处。这样需要改动的时候,只需调整这一处,所有的地方就都变更过来了。
但正如我们所看到的,我们还可以使用 fromEnd 参数来更好地表达我们希望检索最后一项,并在编译时从一个大小未知的数组中检索最后一项。
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];
就这样,一个新的结构体类型和一个旧运算符(^)的新用法打包在一起了。
作者 : John Demetriou
译者 : 技术译民
出品 : 技术译站
链接 : 英文原文
C# 中 System.Index 结构体和 Hat 运算符(^)的全新用法的更多相关文章
- C# 中 System.Range 结构体
翻译自 John Demetriou 2020年4月6日 的文章 <C# 8 Is Introducing Ranges> 我们之前讨论过的 C# 中的一个特性 System.Index ...
- 剔除list中相同的结构体数据
剔除list中相同的结构体数据,有三个思路:1.两层循环,逐个比较 2.使用set容器来剔除 3.使用unique方法去重 // deduplication.cpp : 定义控制台应用程序的入口点. ...
- MFC中的NMHDR结构体和NMUPDOWN结构体
建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM ...
- C语言中 不定义结构体变量求成员大小
所谓的求成员大小, 是求成员在该结构体中 用 sizeof(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话 ...
- 如何系统学习C 语言(中)之 结构体篇
1,结构体 在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现--它们都只适合单一属性的数据.那现实生活中,很多对象都是具有多属性的.例 ...
- Linux中网络通信中 使用的结构体
"+++++++++++++++++++++++++ Linux TCP/UDP通信中的结构体 +++++++++++++++++++++++++++++++++++++++" s ...
- 【2016-08-18】转载:总结C++中几种结构体初始化的方法
作者:Ac_Von 博客地址:http://www.cnblogs.com/vongang/ 文章地址:http://www.cnblogs.com/vongang/archive/2011/07/3 ...
- f2fs解析(七)node管理器中的 free_nid 结构体
除了node_info之外, node管理器中还有还有个重要的数据结构: struct free_nid { struct list_head list; /* for free node id li ...
- 黑马程序员——Foundation中的OC结构体
<span style="font-size:14px">------<a target="_blank" href="http:/ ...
随机推荐
- h5跳转微信公众号关注页面
最近在做h5项目,有个需求是如果用户没有关注公众号,需要引导用户跳转至微信公众号关注页面 制作一个链接,点击该链接跳转到公众号关注页面. 1.从公众平台登进入公众号 2.点击开发>>开发者 ...
- C009:产品格式化输出
代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int itemNum; float unitPric ...
- 测试JsonAnalyzer2的12个测试用例:
测试用例如下: 01. Compact json text={"status":"","message":"success&quo ...
- 网易云uwp
起因 昨天晚上折腾Ubuntu 莫名其妙任务栏的网易云音乐图标消失了,今早才发现原来是更新了. but,这个更新真的是让人一言难尽 upw更新一下直接变成了桌面版? 折腾 重新装回老版uwp 网易云U ...
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
- Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- linux下锁定关键文件/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow、/etc/inittab
锁定/etc/passwd./etc/shadow./etc/group./etc/gshadow./etc/inittab,锁定关键的系统文件可以防止服务器提权后被篡改 1.对关键文件进行加锁,任何 ...
- jsop之---实现过程
JSONP(JSONP - JSON with Padding是JSON的一种“使用模式”),利用script标签的src属性(浏览器允许script标签跨域) 跨域访问,非同源访问 <!DOC ...
- iOS面试关于http知识点basic-01-http
URL URL 的全称是 Uniform Resource Locator(统一资源定位符) 通过 1 个 URL,能找到互联网上唯一的 1 个资源 URL就是资源的地址.位置,互联网上的每个资源都有 ...
- hystrix讲解:熔断降级隔离以及合并请求
对springcloud只是学习了基本的框架搭建,基本上看到的例子都是只使用了fallback 但是hystrix还有线程隔离和请求合并的能力 顺便吐槽 大部分人的博客例子估计都是听课的 应用 ...