C#8.0本质论第四章--操作符和控制流程

news2024/11/16 19:54:32

C#8.0本质论第四章–操作符和控制流程

4.1操作符

有些操作符以符号的形式出现,例如+、-、?.或者??等,而另一些操作符则为关键词,例如default和is

4.1.1一元正负操作符

一元正操作符(+)对值几乎没有影响,它在C#中是多余的。

4.1.2二元算数操作符

在C++中允许像 4+5; 这样的二元表达式作为独立语句使用,在C#中只有赋值,调用,递增,递减,await和对象创建表达式才能作为独立语句使用。

优先级和结合性只影响操作符自身的执行顺序,不影响操作数的求值顺序。在C#中,操作数总是从左向右求值。而在C++中,C++规范允许不同的实现自行选择操作数求值顺序。

        public static int A()
        {
            Console.WriteLine("A");
            return 1;
        }
        public static int B()
        {
            Console.WriteLine("B");
            return 2;
        }
        public static int C()
        {
            Console.WriteLine("C");
            return 3;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(A() + B() * C());
            Console.ReadKey();
        }

在C#中上面代码竖着输出ABC7,如果是C++的话就不一定是ABC的顺序了。

避免将二进制浮点数类型用于相等性条件式,要么判断差是否在容差范围内,要么用decimal类型。

C#中浮点0除以0会得到**“Not a Number”(非数字)**。获取负数的平方根也会得到NaN。

浮点数一旦溢出边界,结果会存储为正无穷大(∞)或负无穷大(-∞)。

//输出-∞
Console.WriteLine(-1.0 / 0);

4.1.3复合赋值操作符

4.1.4递增和递减操作符

对于M(x++,x++)这样的调用,假定x初值是1,在C++中既可以是M(1,2),也可以是M(2,1),具体由编译器决定。C#总是调用M(1,2),因为C#做出了两点保证:第一,传给调用的实参总是从左向右计算;第二,总是先将已递增的值赋给变量,再使用表达式的值(第二点我没看懂)。

4.1.5常量表达式和常量符号

常量表达式是编译器能在编译时求值的表达式,而不是在运行时才能求值

4.3代码块

4.4代码块、作用域和声明空间

关于局部变量的作用域:在C++中,对于块中声明的局部变量,它的作用域从声明位置开始,到块尾结束,如果此时有另一个同名的事物在作用域中,C++会将名称解析为对那个事物的引用。C#稍有不同,对于声明局部变量的那个块,局部变量都在作用域中,但声明前引用它属于非法。换言之,此时局部变量合法存在,但使用非法。这是C#防止像C++那样出现不容易察觉之错误的众多规则之一。

在这里插入图片描述

4.5布尔表达式

C#要求条件必须是布尔类型,因此它消除了C++的一个常见的编码错误,将==写成=。

4.5.1关系操作符和相等操作符

4.5.2逻辑操作符

4.5.3逻辑求反操作符

4.5.4条件操作符

因为它是唯一的三元操作符,所以通常直接称它为三元操作符。

condition ? consequence : alternative

条件操作符也采用了某种形式的短路求值。如condition为true,则只求值consequence,否则只求值alternative。

C#要求条件操作符consequence和alternative表达式类型一致,而且在判断类型时不会检查表达式的上下文。

在这里插入图片描述

4.6关于null的编程

4.6.1检查null值

**==和!=**可以在所有版本的C#中使用,但是它们可以被类覆盖,从而引入轻微的性能影响。

**ReferenceEquals()**方法用于判断两个引用型变量是否指向了内存中的同一个对象,而不是判断是否有相同的数据内容。它不可以被覆盖,因此可以确保它的行为不会被改变。

is模式匹配操作符通过测试一个变量是否是一个对象,来判断其是否不为null值,C#7.0加强了改操作符,专门提供了is null来判断值为null的情形。

is { }模式匹配操作符,也可以用来判断一个变量是否不为null值,但有一个小优点,如果变量为不可空类型,编译器会发出警告

4.6.2空合并操作符与空合并赋值操作符

**空合并操作符??**能简单地表示"如果这个值为空,就使用另一个值"。支持短路求值,能完美链接,可以连写,x??y??z。

C#8.0引入了空合并赋值操作符,如果等号左边的变量不为null。则维持其原值不变,否则将用等于号右侧表达式的值对等于号左侧的变量进行赋值。如name??=“name”;

4.6.3空条件操作符

C#6.0引入了?.操作符,称为空条件操作符,它产生的运算结果永远是可空类型,也可以用于访问数组,如segments?[0]将在数组不为null的前提下获取数组元素。

//C#8.0中数组及其元素均声明为可空
string?[]? segments;

4.6.4空包容操作符

uri = string.Join('/',segments!);

在C#8.0中可以使用空包容操作符(!)来避免警告,告诉编译器程序员可以保证某个变量一定不为null值,但是执行的时候运行时库仍然会检查null值。

4.7按位操作符

4.7.1移位操作符

4.7.2按位操作符

和&&不同,&操作符总是两边求值,即使左边为false,|也一样。

有内建的System.Convert.ToString(value,2)可以转换成二进制。

4.7.3按位复合赋值操作符

4.8控制流程语句

4.8.1while和do/while循环

4.8.2for循环

4.8.3foreach循环

它迭代数据项集合,每一项只迭代一次,不会出现计数错误,可不可能越过集合边界。

foreach(type variable in collection)
	statement

variable是只读变量

4.8.4基本switch语句

switch(expression)
{
	case constant:
		statements
	default:
		statements
}

statements这组语句的结束点必须“不可到达”,换言之,不能“直通”或“贯穿”到下一个switch小节,所以,锁喉一个语句通常是跳转语句,如break,return或goto。

switch语句应至少有一个switch小节,switch{}合法但会产生一个警告。

在C++中switch小节如不以跳转语句结尾,控制会“贯穿”至下一个switch小节并执行其中的代码,由于在C++中容易出错,所以C#不允许控制从一个switch小节自然贯穿到下一个。但可以使用goto语句来实现贯穿。

C#7.0为switch引入了模式匹配。

4.9跳转语句

4.9.1break语句

4.9.2continue语句

4.9.3goto语句

C#支持goto而且只能利用goto在switch中实现贯穿。C#禁止通过goto跳入代码块,避免了在其他语言中可能遇到的大多数滥用goto的情况。

4.10C#预处理器指令

预处理器指令告诉C#编译器要编译哪些代码,并指出如何处理代码中的特定错误和警告。

C和C++等语言用预处理器对代码进行整理,告诉编译器如何编译文件中的代码,而并不参与实际的编译过程。相反,C#编译器将预处理器指令作为对源代码执行的常规词法分析的一部分。结果就是C#不支持更高级的预处理器宏,最多只允许定义常量。

4.10.1排除和包含代码

预处理器指令可以处理不同平台之间的差异。

4.10.2定义预处理器符号

4.10.3生成错误和警告

4.10.4关闭警告消息

4.10.5nowarn:选项

4.10.6指定行号

4.10.7可视编辑器提示

C#允许用#region指令声明代码区域。

4.10.8启用可空引用类型

预处理器指令可以处理不同平台之间的差异。

4.10.2定义预处理器符号

4.10.3生成错误和警告

4.10.4关闭警告消息

4.10.5nowarn:选项

4.10.6指定行号

4.10.7可视编辑器提示

C#允许用#region指令声明代码区域。

4.10.8启用可空引用类型

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

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

相关文章

python 连接Redis 数据库

pip install redis python代码 import redis# 连接数据库 r redis.Redis(host192.168.56.15, port6379, db0)# 存储数据 #r.set(key, value) r.set(name, zaraNet)# 获取数据 value r.get(name) print(value)# 关闭连接(可选) r.close()

AP9196 DC-DC 升压 升降压 恒流电源管理芯 LED电源驱动IC

产品说明 AP9196 是一系列外围电路简洁的宽调光比升压调光恒流驱动器,适用于 3-40V 输入电压范围的 LED照明领域。AP9196 采用我司专利算法,可以实现高精度的恒流效果,输出电流恒流精度≤3%,电压工作范围为5-40V&…

Redis 缓存满了怎么办?

引言 Redis 缓存使用内存来保存数据,随着需要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。此时,应该怎么办?本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。 值得注意的是,在 Redis 中 过期策略 和…

【rar密码】rar压缩包密码列表

之前给大家介绍过WinRAR自动加密的设置方法,今天再介绍一种RAR压缩包加密方法:整理密码。 什么是整理密码: 在加密rar文件的时候,点击下拉框选择密码,不用输入密码 设置方法: 前面的操作步骤和设置自动…

正中优配:尾盘拉升的股票第二天的走势?

尾盘拉升是指买卖日快结束时股票价格呈现上涨的状况。关于许多投资者来说,这一般是好事情,因为它可认为他们带来更高的收益。但是,人们常常会问尾盘拉升的股票第二天的走势怎么。本文将从多个角度进行剖析。 首要,咱们需求认识到这…

这所211太好考了!263分上岸!平均分300分!

一、学校及专业介绍 宁夏大学(Ningxia University,简称:宁大),是中国教育部与宁夏回族自治区人民政府合建高校,位列国家“双一流”“211工程”重点建设高校,国家“中西部高校综合实力提升工程”…

cpolar+JuiceSSH实现手机端远程连接Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

成绩管理神器

各位老师们是不是需要一款方便快捷班级查询工具?其实易查分就可以帮助老师和学生轻松地管理和查询成绩。查分系统是现代教育管理的一项重要工具,传统纸质成绩单已被易查分电子成绩单所取代,带来了方便快捷等多种优势,为学生、家长…

scroll 和 wheel 事件的区别

listRef.addEventListener(“scroll”, onScroll),onScroll 里面打 log 打不出来。 我觉得 list 是一个长的列表,比 container 要长,应该能滚动才是,不知道为啥滚动不了 当时我想到的是可能电视不支持这个事件,但是问…

OSCS开源安全周报第 56 期:Apache Airflow Spark Provider 任意文件读取漏洞

本周安全态势综述 OSCS 社区共收录安全漏洞 3 个,公开漏洞值得关注的是 Apache NiFi 连接 URL 验证绕过漏洞(CVE-2023-40037)、PowerJob 未授权访问漏洞(CVE-2023-36106)、Apache Airflow Spark Provider 任意文件读取漏洞(CVE-2023-40272)。 针对 NPM 、PyPI 仓库…

饼图的legend文字太长和数量太多处理

legend文字太长和数量太多 在我们使用图表饼图的时候会发现因为数据太多导致页面的布局发现重叠或者不好看,比如label的文字太长了,legend的数量太多了等一些问题,所以今天我们就来聊聊遇到这些问题的是可以通过那些设置来进行改进 文字太长…

第12步---MySQL的JDBC操作

第12步---MySQL的JDBC操作 1.概述 采用Java API 的方式实现数据之间的操作。 根据不同的数据库采用了不同的驱动,接口是一致的。 下载的地址 MySQL :: Download MySQL Connector/J (Archived Versions) 2.执行流程 注册驱动 创建连接 执行sql语句的对象 结果…

10个最受欢迎的免费STL模型下载网站【2023】

推荐:用 NSDT编辑器 快速搭建可编程3D场景 你是否决定立即购买 3D 打印机? 或者可能一直在考虑并正在寻找更多细节来了解它如何使您受益? 好吧,总有一天,你拥有 3D 打印活动所需的所有知识和资源,但没有时…

【SpringCloud】SpringCloudAlibaba官网资料

出现原因 Spring Cloud Netflix Projects Entering Maintenance Mode 官网 博客 https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md官网 https://spring.io/projects/spring-cloud-alibaba#overview英文 https://github.com/alibaba/spring-cloud-…

refresh大揽

注意在每一步大操作之前都有一个前期准备 prepareRefresh() 设置spring启动的时间 设置spring关闭和开启的标志位 获取环境对象,并设置一些属性值,是系统环境的不是xml设置的 设置监听器,以及需要发布事件的集合。 Con…

Java算法_ BST 中第 k 个最小元素 (LeetCode_Hot100)

题目描述:给定一个二叉搜索树的根节点 ,和一个整数 ,请你设计一个算法查找其中第 个最小元素(从 1 开始计数)。 获得更多?算法思路:代码文档,算法解析的私得。 运行效果 完整代码 /*** 2 * Aut…

实验三 HBase1.2.6安装及配置

系列文章目录 文章目录 系列文章目录前言一、HBase1.2.6的安装二、HBase1.2.6的配置2.1 单机模式配置2.2 伪分布式模式配置 总结参考 前言 在安装HBase1.2.6之前,需要安装好hadoop2.7.6。 本篇文章参考:HBase2.2.2安装和编程实践指南 一、HBase1.2.6的安…

双频RTK定位技术原理及解决方案

双频RTK定位技术 双频RTK(Real-Time Kinematic)定位技术是一种利用卫星导航系统进行高精度实时定位的方法,它通过同时使用两个不同频率的载波信号来测量载波相位差,从而提高定位精度和抗干扰能力。以下是双频RTK定位技术的原理和解…

一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)

本地搭建ChatGPT(非api调用) 第一种方法:使用Docker本地化部署第一步,下载安装Docker登录GPT 第二种方法:不部署项目,直接连接 第一种方法:使用Docker本地化部署 这种方法的好处就是没有登录限…

dolphinscheduler的僵尸任务清理和清理一直在运行的任务状态

dolphinscheduler的僵尸任务清理 界面操作不了的 只能去数据库更改状态或则删除掉 原因:海豚调度中有几百条僵尸任务, 界面怎么也删不掉,想从数据库中删除,开始查找从数据库删除的办法。 参考以下脚本,结合我库中僵尸…