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

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启用可空引用类型

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

测试框架pytest教程(4)运行测试

运行测试文件 $ pytest -q test_example.py 会运行该文件内test_开头的测试方法 该-q/--quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中,但如果写在类中,类名需要是Test开头,非Test开头的类下的test_方法不会被搜集为用…

<kernel>kernel 6.4 USB-之-hub_port_connect()分析

<kernel>kernel 6.4 USB-之-hub_port_connect()分析 kernel 6.4 USB系列文章如下: <kernel>kernel 6.4 USB-之-hub_event()分析 <kernel>kernel 6.4 USB-之-port_event()分析 <kern…

LeetCode.141,142——环形链表,环形链表Ⅱ

LeetCode.141——环形链表: 题目如下: 通过题目中对于环形链表的大体描述,可以知道,环形链表最后一个结点保存了一个地址,用于返回链表中某个结点。并且。这个返回的结点并不是返回图中保存数据的结点。而是返回链表…

TCP特点UDP编程

目录 1、tcp协议和udp协议 2、多线程并发和多进程并发: (1)多进程并发服务端 (2)多进程并发客户端: 3、tcp: 4、粘包 5、UDP协议编程流程 (1)服务器端: (2)客户端: 6、tcp状…

成集云 | 乐享问题邀请同步企微提醒 | 解决方案

源系统成集云目标系统 方案介绍 腾讯乐享是腾讯公司开发的一款企业社区化知识管理平台,它提供了包括知识库、问答、课堂、考试、活动、投票和论坛等核心应用。这个平台凝聚了腾讯10年的管理经验,可以满足政府、企业和学校在知识管理、学习培训、文化建…

Java实现钉钉企业内部应用机器和自定义机器人发送消息

前言 公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义机器人…

8年经验之谈 —— 基于jmeter的性能全流程测试

01、做性能测试的步骤 1、服务器性能监控 首先要在对应服务器上面安装性能监控工具,比如linux系统下的服务器,可以选择nmon或者其他的监控工具,然后在jmeter模拟场景跑脚本的时候,同时启动监控工具,这样就可以获得jm…

Android Studio run app 设置 release 模式

背景 为验证我们的 SDK 集成在客户应用上的质量,需要我们的测试环境尽量的与客户应用保持一致。客户普遍都会打 release 包并混淆,然后进行上线应用,因此我们在测试过程中也需要使用 release 包进行验证。对于 Android Studio 运行项目&…

Jmeter数据驱动 —— csv高效用例

目录 1、设置测试用例,创建用例数据文件:testcase.csv 2、新建一个线程组,命名为:数据驱动,添加配置元件-HTTP请求默认值,配置好IP地址和端口号 3、添加逻辑控制器-循环控制器。循环控制器的作用可以控制…

【C++】运算符重载 | 赋值运算符重载

Ⅰ. 运算符重载 引入 ❓什么叫运算符重载? 就是:运用函数,将现有的运算符重新定义,使其能满足各种自定义类型的运算。 回想一下,我们以前运算的对象是不是都是int、char这种内置类型? 那我们自定义的“…

CST HFSS MATLAB参数方程定义曲面绘制

CST HFSS 函数定义曲面绘制 简介环境HFSSCSTMATLAB 简介 若在柱坐标系中半径r随z和phi都会变,无法使用一般的方法绘制,这时可以使用参数方程定义的曲面来绘制。举一个例子如下, r 100 0.5 ( c o s ( 0.2 ∗ p i ∗ z ) − 1 ) c o s ( φ …

Ganache 本地测试网远程连接

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络,提供图形化界面,log日志等;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

哪些人适合参加大数据培训班?

互联网加速职场变革,大数据浪潮席卷全球。日前,Python、大数据、人工智能是当今最热门的话题。大数据存储、大数据分析、 人工智能等开发人才需求旺盛。 大数据培训班有大数据分析培训班、大数据开发培训班,JAVA培训班 大数据班适学人群…

【RabbitMQ】RabbitMQ整合SpringBoot案例

文章目录 1、前情提要【RabbitMQ】2、RabbitMQ-SpringBoot案例 -fanout模式2.1 实现架构总览2.2 具体实现2.2.1生产者2.2.1消费者 1、前情提要【RabbitMQ】 【RabbitMQ】消息队列-RabbitMQ篇章 RabbitMQ实现流程 2、RabbitMQ-SpringBoot案例 -fanout模式 2.1 实现架构总览…

快速学习GO语言总结

备注:本博客将自己初步学习GO的总结进行分享,希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力,如有错误请留言指正,谢谢! 一、初步了解Go语言 (一)Go语言诞生的主要问题和目标…

Elasticsearch:语义搜索 - Semantic Search in python

当 OpenAI 于 2022 年 11 月发布 ChatGPT 时,引发了人们对人工智能和机器学习的新一波兴趣。 尽管必要的技术创新已经出现了近十年,而且基本原理的历史甚至更早,但这种巨大的转变引发了各种发展的“寒武纪大爆炸”,特别是在大型语…

【数据结构】_7.二叉树

目录 1.树形结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的应用—表示文件系统的目录树结构 ​编辑​2.二叉树 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储结构(数组存储结构) 2.4.2…

7个改变玩法规则的ChatGPT应用场景

ChatGPT因各种原因受到了广泛关注:ChatGPT可以充当各种改善生活改进工作的小助手,如内容写手、客户支持、语言翻译、编码专家等等。只需在你的聊天内容中添加适当的提示,人工智能将为你提供各项支持。[1] 1.ChatGPT作为内容写手 通过AI的帮助…

flink jira 提交开源bug

注册apache issue账号,并申请flink空间的权限后. 提问题/bug 查看已经提交的问题:

PHP“牵手”淘宝商品评论数据采集方法,淘宝API接口申请指南

淘宝天猫商品评论数据接口 API 是开放平台提供的一种 API 接口,它可以帮助开发者获取商品的详细信息,包括商品的标题、描述、图片等信息。在电商平台的开发中,详情接口API是非常常用的 API,因此本文将详细介绍详情接口 API 的使用…