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  
译者 :技术译民
出品 :技术译站(https://ITTranslator.cn/)

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lagrange Multipliers 拉格朗日乘数法(含 KKT 条件)

最优化问题通常是指对于给定的某一函数,求其在指定作用域上的全局最小值,一般情况下,最优化问题一般分为三种情况: (1)无约束条件 对于无约束条件的优化问题中,如果一个函数 f 是凸函数&#…

蓝桥杯-代码-数字三角形

一:题目 二:代码 #include <iostream> #include<vector> using namespace std; int main() {/**思路:1.确定dp数组的定义以及下标的含义dp[i][j] 表示的是一条路径到达下标i和j时&#xff0c;的最大值 2.确定dp数组的状态转移公式我们当前位置的最大值其实是由右上…

ABP VNext从单体切换到微服务

注&#xff1a;此处的微服务只考虑服务部分&#xff0c;不考虑内外层网关、认证等。ABP VNext从单体切换到微服务&#xff0c;提供了相当大的便利性&#xff0c;对于各模块内部不要做任何调整&#xff0c;仅需要调整承载体即可。ABP can help you in that point by offerring a…

dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用

在前面几篇博客告诉大家如何部署 GTK 应用&#xff0c;此时的应用是特别弱的&#xff0c;大概只是到拖控件级。尽管和 WinForms 一样也能写出特别强大的应用&#xff0c;但是为了提升一点开发效率&#xff0c;咱开始使用 xaml 神器写界面。本文告诉大家如何在 UOS 国产系统上&a…

赛码-编程题-打字

一:题目 二&#xff1a;上码 #include<bits/stdc.h> using namespace std;int main() {int n;vector<int> v1;cin >> n;for(int i 0; i < n; i) {string str;int count 0;cin >> str;for (int j 0; j < str.size(); j) {int num int(str[j]…

Python 中的 with 语句用法和 Pytorch 中的 with torch.no_grad() 解析

Python 中的 with 语句适用于对资源进行访问的场合&#xff0c;确保不管使用过程中是否发生异常都会执行必要的“清理”操作&#xff08;异常处理&#xff09;&#xff0c;释放资源&#xff0c;比如文件使用后自动关闭&#xff0f;线程中锁的自动获取和释放等。例如下面是文件读…

遍历 Dictionary,你会几种方式?

一&#xff1a;背景 1. 讲故事昨天在 StackOverflow 上看到一个很有趣的问题&#xff0c;说: 你会几种遍历字典的方式&#xff0c;然后跟帖就是各种奇葩的回答&#xff0c;挺有意思&#xff0c;马上就要国庆了&#xff0c;娱乐娱乐吧&#xff0c;说说这种挺无聊的问题?????…

PyTorch 中各种操纵维度的函数比较 view() reshape() squeeze() unsqueeze() flatten()

首先&#xff0c;假设我们有一个三行四列的张量 X&#xff1a; view() 和 reshape() 函数都可以指定并改变张量的维度&#xff0c;它们本质上是相同的&#xff0c;只有两点区别&#xff1a; 1、view() 函数返回的是原始张量的视图&#xff0c;而 reshape() 函数返回的是原始张…

.NET Core 下的 API 网关

网关介绍网关其实就是将我们写好的API全部放在一个统一的地址暴露在公网&#xff0c;提供访问的一个入口。在 .NET Core下可以使用Ocelot来帮助我们很方便的接入API 网关。与之类似的库还有ProxyKit&#xff0c;微软也发布了一个反向代理的库YARP。关于网关的介绍不多说了&…

leetcode剑指 Offer 29. 顺时针打印矩阵

一&#xff1a;题目 二:上码 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {//判空处理 否则会出现空指针异常if(matrix.size() 0 || matrix[0].size() 0){return {};}int m matrix.size();// 行int n matrix[0].…

VS也可以这样进行快捷安装

前言记录带新人的那些事&#xff0c;主要是一些工作技巧上的分享部门老大&#xff1a;阿元&#xff0c;明天有几个实习生新人开发来入职&#xff0c;你负责带一下他们阿元&#xff1a;明天吗&#xff1f;哦&#xff0c;好的&#xff0c;顺便问下&#xff1a;男的女的&#xff1…

蓝桥杯-卡片-填空题

一:题目 二:思路 1是最快消耗完的计算1的个数即可 三&#xff1a;上码 #include <iostream> using namespace std; int main() {int ans 0;int count 0;for(int i 1; i < 20000; i) {string str to_string(i);// cout << str << endl;for(int j …

跟我一起学.NetCore之Swagger让前后端不再烦恼及界面自定义

前言随着前后端分离开发模式的流行&#xff0c;接口对接、联调成为常事&#xff0c;前端同事会经常问&#xff1a;我需要调哪个接口&#xff1f;这个接口数据格式是啥&#xff1f;条件都传啥&#xff1f; 对于一些紧急接口可能会采取沟通对接&#xff0c;然后补文档&#xff0c…

由浅入深,带你搞懂 Pytorch 中的张量 tensor 是什么

目录1、tensor 是什么&#xff1f;2、tensor 的三个属性2.1 Rank 秩2.2 Axis&#xff08;复数 为 Axes&#xff09; 轴2.3 Shape 形状3、Pytorch 中 torch.Tensor 的三个属性3.1 torch.dtype3.2 torch.device3.3 torch.layout4、创建张量的两种方法4.1 从现有数据创建张量4.2 凭…

蓝桥杯-排序-填空题

一:题目 二:上码 #include <iostream> using namespace std; int main() {// 请在此输入您的代码/**/**冒泡排序中:我们考虑到最坏的情况,那就是全都是逆序 那么就需要交换 N(N-1)/2; 那么100次 最起码需要 15个字符&#xff0c;而15个字符完全逆序的话 需要交换 105次…

打造钉钉事件分发平台之钉钉审批等事件处理

前言上讲和上上讲我们说到了钉钉的审批和钉钉通讯录的一个简单示例&#xff0c;这次我们讲下如何快速打造一个自己的钉钉事件分发平台。让你能够通过监听用户在钉钉上的操作&#xff0c;然后进行对应的业务处理&#xff0c;比如钉钉流程审批完后业务处理、通讯录员工增加后对应…

Pytorch 中 Dataset 和 DataLoader,以及 torchvision 的 datasets 完全理解

目录1、torch.utils.data.Dataset()2、torch.utils.data.Sampler()3、torch.utils.data.DataLoader()4、torchvision.datasets.ImageFolder()5、例子 torchvision.datasets.FashionMNIST()1、torch.utils.data.Dataset() 首先最基础的&#xff0c;是 torch.utils.data.Dataset…

蓝桥杯-成绩分析-编程题

一:题目 二&#xff1a;上码 #include<bits/stdc.h> using namespace std;int main() {int n;cin >> n;vector<int> v(n,0);for (int i 0; i < n; i) {cin >> v[i];}sort(v.begin(),v.end());double sum accumulate(v.begin(),v.end(),0);double…

BeetleX框架详解-小结

到这里BeetleX组件代码讲解完成了&#xff0c;由于组件只封装了TCP基础通讯的功能&#xff0c;因此在内容上并不会有太多&#xff1b;通以上内容相信对BeetleX的设计有一定的了解&#xff0c;在使用上也更加容易。要点Socket对象应用SocketAsyncEventArgs对象应用线程池的应用与…

深度学习入门笔记 —— 循环神经网络 RNN

首先&#xff0c;明确 RNN 的主要任务是用于文本分类&#xff0c;而解决文本分类任务最经典的模型是词袋模型&#xff08;Bag-of-Words Model&#xff09;&#xff0c;如图所示&#xff0c;输入是三个句子&#xff0c;词袋模型首先要定义一个词汇表 vocabulary&#xff0c;里面…