Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【5min+】 这些C#的运算符您都认识吗?

【5min+】 这些C#的运算符您都认识吗?

作者头像
句幽
发布于 2020-04-27 08:16:29
发布于 2020-04-27 08:16:29
62400
代码可运行
举报
文章被收录于专栏:一起玩转.NET一起玩转.NET
运行总次数:0
代码可运行

系列介绍

【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。 5min+不是超过5分钟的意思,"+"是知识的增加。so,它是让您花费5分钟以下的时间来提升您的知识储备量。

正文

对于“ + ”,“ - ”,“ * ”,“ / ”,“ is ”,“ as ” 等C#的运算符可能大家都再熟悉不过了。但是有时候大家在阅读一些网站上的代码或者开源项目的源码时,会遇到一些奇奇怪怪的运算符,特别当几个少见的运算符连在一起的时候,仿佛有一种 “别人的C#和我的C#怎么不一样” 的感觉。

随着C#的版本更新,它为我们提供了许许多多的语法糖和新运算符方便我们更流畅的来编写代码。当有时候遇到不认识的运算符,所以,本文就整理了一些好玩儿的运算符做成了一个合集。如果碰到了不认识的操作符,也方便在这儿来查找。

先来看一段代码吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (isFlagged)
{
    _bits[propertyIndex / BitsPerInt] |= 1 << (propertyIndex % BitsPerInt);
}
else
{
    _bits[propertyIndex / BitsPerInt] &= ~(1 << (propertyIndex % BitsPerInt));
}
//节选自EF Core 中的结构体 “StateData”

有没有猛的一看感觉已经不认识了的样子?。毕竟对于咱们平时开发应用层面的开发者来说,很多位运算符很少用到,一下碰到了都忘记了什么意思。

各类运算符

补位运算符 ~

~ 运算符通过反转每个位产生其操作数的按位求补:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
byte a = 10;   // 二进制 0000 1010
var b = (byte)~a;    // 二进制 1111 0101 。 b的十进制:245
移位运算符 <<>>

<< 运算符将其左侧操作数向左移动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
byte a = 10;   // 0000 1010
var b = (byte)a<<2;    // 0010 1000。  b=40

>> 运算符将其左侧操作数向右移动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
byte a = 10;   // 0000 1010
var b = (byte)a<<2;    // 0000 0010。  b=2

比如 10 * 2^3 当我们用C#写的时候可能会写: 10 * Math.Pow(2,3) ,而现在可以直接写 10 << 3。

逻辑运算符 ^

当然逻辑运算符还有其它的几个,比如 & 和 | ,这些平时大家用的比较多所以就不多写了。

^ 运算符计算其操作数的位逻辑异或:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
byte a = 10;   // 0000 1010
var b = a ^ 0b_0010_1011;    // 0010 0001

所以如果配上咱们C#的复合运算,比如 +=-=。相应的,上面的符号就可以写成 >>=|= , &= , ^= 等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
byte a = 10;
a <<=2;   // 40
索引运算符 ^

没错,还是这个符号。如果在索引器 [] 中使用它,它将充当索引的作用。 ^ 运算符在 C# 8.0 和更高版本中提供,指示序列末尾的元素位置。例如,^1 指向序列的最后一个元素,^length 指向序列的第一个元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] xs = new[] { 0, 10, 20, 30, 40 };
int last = xs[^1];
Console.WriteLine(last);  // output: 40

所以当我们需要逆序来访问索引器的时候就不需要写成 : array[array.length - i] 了,直接^i 就可以了。

Null 条件运算符 ?.?[]

仅当操作数的计算结果为非 null 时,null 条件运算符才会将成员访问 ?. 或元素访问 ?[] 运算应用于其操作数;否则,将返回 null。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A?.B?.Do(C);
A?.B?[C];

该操作符相信很多小伙伴早就使用起来了,毕竟可以直接省略掉我们的 if(A==null),大幅提高了我们的编码流畅度。

范围运算符 ..

这个操作符很好玩,它是最新版本C#中才更新的。 .. 运算符在 C# 8.0 和更高版本中提供,指定索引范围的开头和末尾作为其操作数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int start = 1;
int amountToTake = 3;
int[] subset = numbers[start..(start + amountToTake)];
Display(subset);  // output: 10 20 30

它可以结合上面的索引运算符 ^ 一同使用,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int margin = 1;
int[] inner = numbers[margin..^margin];
Display(inner);  // output: 10 20 30 40

所以我们就可以不用去for循环然后再来截取原视数组的部分了。

类型测试运算符 is

该关键字其实大家也很熟悉,但是在C# 7之后,它新增了:有模式匹配的类型测试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object iBoxed = i;
if (iBoxed is int a)
{
    Console.WriteLine(a);
}

在常规的类型测试表达式后面跟上一个变量,则该变量会转换为测试运算后的结果。这样就不需要我们再去做一次判断了。

一说到这里,我突然想到如果以后的C#能够支持这种表达式就好了,虽然只是YY?:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(cacl() != null)
{
    var result = cacl();
    //use result do something 
}

//如果能更改为这样就好了
if(cacl() result !=null)
{
    //use result do something 
}
Null 合并运算符 ??

该运算符也是非常有用的。如果左操作数的值不为 null,则 null 合并运算符 ?? 返回该值;否则,它会计算右操作数并返回其结果。 如果左操作数的求值结果为非 null,则 ?? 运算符不会对右操作数求值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int? a = null;
int b = a ?? -1;
Console.WriteLine(b);  // output: -1

这样就避免了我们每次都会去写一个 if(xx = null),从而大大简化我们的代码。 并且它还可以一直推算下去:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a ?? b ?? c

而在C# 8之后,??运算符还提供了合并运算的版本 ??= 。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
b = b?? a;
//等同于
b??=a;

所以咱们经常对List判断是否为空,赋予初始值的操作,现在只需要一句话就完成了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
someList ??= new List<int>()).Add(5);

再结合上面的一些操作符来使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
{
    return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
}

总结

所以现在咱们再来看一些感觉奇怪的符号就觉得自然得多了,这些运算符不知道帮助咱们省略掉了多少的if- else。

本文只是选取了一些不常见的运算符来介绍,而常见的 " | "、“ & ” ,“ ?. ” 等运算符相信大家用的也比较多了,所以就不再提及。 还有就是关于指针的一些操作符,比如: " -> " , “ * ”等也没有涉及。

当然,如果您用的是最新的C#版本,你可以使用所有的这些简写运算符,如果您使用的是以往的版本,请确保该运算符被支持哟。

本篇文章也不属于什么技术分享。不过有时候这些基础的东西往往会对咱们编码提供很大的便利性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#基础知识系列四(运算符汇总)
   本节主要来讲C#中的各种运算符。主要包括is运算符、as运算符、checked和unchecked运算符、sizeof运算符、空接合运算符(??)、&和&&、移位运算符、增量和减量运算符、条件运算符(三元运算符)、命名空间别名限定符。
aehyok
2018/09/11
7830
C#基础知识系列四(运算符汇总)
C++移位运算符
The behavior is undefined if the right operand is negative, orgreater than or equal to the length in bits of the promoted left operand.
全栈程序员站长
2022/07/15
6980
Python教程(13)——Python运算符详解|算术运算符|比较运算符|逻辑运算符|位运算符
Python的运算符是用于执行各种操作的符号或符号组合。它们用于操作数据并进行算术、比较、逻辑和其他类型的运算。我们所熟知的加减乘除也是运算符中的一种。Python提供了多种类型的运算符,有算术运算符,比较运算符,赋值运算符,逻辑运算符,位算符等等。
一点sir
2023/09/10
4250
Python教程(13)——Python运算符详解|算术运算符|比较运算符|逻辑运算符|位运算符
《深入浅出Dart》运算符
运算符是一种特殊的符号,用于检查,更改或结合值。Dart语言中的运算符主要包括以下几类:
linwu
2023/07/27
5420
【Java】运算符详解!!!
移位运算符有三个(<< 、>> 、>>>) ,都是二元操作符,按二进制比特位运算
喜欢做梦
2024/11/25
1150
【Java】运算符详解!!!
【Java SE语法篇】3.运算符
上述 + 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。
爱敲代码的小杨.
2024/05/07
890
【Java SE语法篇】3.运算符
Java 位运算符
位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面详细介绍每个位运算符。
老九学堂-小师弟
2019/09/20
1.2K0
Golang语言--运算符
运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。 Go语言有丰富的内置运算符和运算符提供的以下几种类型: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其它运算符 本教程将一个接一个介绍算术,关系,逻辑,位,分配和其他运算符。 算术运算符 下表列出了所有Go语言支持的算术运算符。假设变量A=10和变量B=20则: 算术运算符示例 运算符 描述 示例 + 两个操作数相加 A + B = 30 - 第一个操作数减第二操作数 A - B = -10 * 两个操作数相乘 A * B = 200 /
李海彬
2018/03/21
1.1K0
【5min+】 这些C#的运算符您都认识吗?
【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。 5min+不是超过5分钟的意思,"+"是知识的增加。so,它是让您花费5分钟以下的时间来提升您的知识储备量。
梁规晓
2020/02/26
6540
C#小语法(一)
今天分享几个有意思的关于可为NULL的运算符,可以使代码更简洁,让别人阅读你的代码时感到心情愉悦。作为一个有追求的开发者,尽量写的可读性强些。
李明成
2020/02/12
4080
☀️ 学会编程入门必备 C# 最基础知识介绍(三)——变量、常量、运算符、判断、循环
程序运行期间,可以被改变的量 本质:变量是一个存储空间,被改变的是存储的内容 注意:变量一定要先定义再使用
呆呆敲代码的小Y
2021/08/20
7980
☀️ 学会编程入门必备 C# 最基础知识介绍(三)——变量、常量、运算符、判断、循环
Python基本运算符
什么是操作符? 简单的回答可以使用表达式4 + 5等于9,在这里4和5被称为操作数,+被称为操符。 Python语言支持操作者有以下几种类型。 算术运算符 比较(即关系)运算符 赋值运算符 逻辑运算符 位运算符 会员操作符 标识操作符 让我们逐一看看所有的运算符。 Python算术运算符: 假设变量a持有10和变量b持有20,则: [ 查看示例 ] 操作符 描述符 例子 +加法 - 对操作符的两侧增加值a + b = 30-减法 - 减去从左侧操作数右侧操作数a - b = -10*乘法 - 相乘的运
李海彬
2018/03/22
1K0
MySQL(六)之MySQL常用操作符
前言 在前面的MySQL学习中,我们学习了MySQL的安装,管理以及配置,还有是它的DDL。今天给大家分享一下,MySQL的操作符。 千里之行始于足下,做什么事情都要脚踏实地的去做才能做好它。fighting! 一、MySQL操作符   运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算。常见的运算有数学计算、比较运算、位运算以及逻辑运算。   运用运算符可以更加灵活地使用表中的数据,常见的运算符类型有:算术运算符,比较运算符,逻辑运算符,位运算符等。 二、算术运算符     用于各类数值运
用户1195962
2018/01/18
1.9K0
MySQL(六)之MySQL常用操作符
【修正】深入理解C#位运算:掌握位运算符的妙用
C#位运算是一种强大的工具,可以在处理二进制数据和位操作时发挥重要作用。通过使用位运算符,我们可以对整数进行位级别的操作,如位与、位或、位异或和位取反等。位运算可以用于优化性能、压缩数据、实现位掩码和位标志等。了解和掌握C#位运算的基本原理和常见应用场景,将使我们能够更高效地处理二进制数据,并在某些情况下提高代码的性能和可读性。通过深入理解C#位运算,我们可以在编程中发挥更大的创造力和灵活性。
沙漠尽头的狼
2023/11/13
4310
【修正】深入理解C#位运算:掌握位运算符的妙用
Java中的位运算符,你真的掌握了吗?
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2023/11/17
3690
Java中的位运算符,你真的掌握了吗?
千万别小看这些运算符背后的逻辑
最近回顾javascript的一些基础知识点时,引起的思考确实颠覆了我之前的一些认知。我清楚地记得曾多次在网上看到一些奇奇怪怪的表达式,它们的运算结果着实让人懵逼。就比如我在js数据类型很简单,却也不简单这一篇笔记中提到的[] == ![]这样一个表达式,它的运算结果是true。如果你不细致地去研究它背后的运算逻辑,你只会惊呼”这是什么鬼“?相反,当你静下心来看清楚它的运算逻辑后,你会感叹“妙哉妙哉”!没错,本文的主角就是这些容易让人小觑的运算符。
程序员白彬
2020/07/10
7640
千万别小看这些运算符背后的逻辑
《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(自增自减、关系运算、逻辑运算、条件运算、位运算、赋值运算、类型转换)
       在程序中,变量的加1、减1操作是经常会碰到的。Java和其他语言一样,给我们提供了自增、自减运算符来方便的完成这些操作。“++”表示自增,“--”表示自减。我们看一个例子:
用户7801119
2020/09/27
7810
C#历来语法特性总结
C# 11已与.NET 7一起发布,本文按照.NET的发布顺序,根据微软官方文档整理C#中一些有趣的语法特性。
郑子铭
2023/09/19
4381
C#历来语法特性总结
表达式树练习实践:C# 五类运算符的表达式树表达
这些运算符根据参数的多少,可以分作一元运算符、二元运算符、三元运算符。本文将围绕这些运算符,演示如何使用表达式树进行操作。
痴者工良
2021/04/26
7960
JAVA位运算等运算符总结
可以将boolean的true和false看作是1和0,这样&和|的意义就是按位与和按位或。
品茗IT
2020/08/06
6420
推荐阅读
相关推荐
C#基础知识系列四(运算符汇总)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验