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

2023-10-31

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Scrum认证Scrum Master(CSM)认证课

    课程简介 Scrum是目前运用最为广泛的敏捷开发方法 是一个轻量级的项目管理和产品研发管理框架 旨在最短时间内交付最大价值 根据2021年全球敏捷状态报告 Scrum及Scrum衍生方法的应用占比达到81 在企业的敏捷转型历程中 Scrum
  • Mock.js 前端数据模拟工具

    什么是Mock js Mock js是一个功能强大的模拟数据生成器 它可以帮助开发者在前端开发过程中模拟后端数据 使得前端开发者可以在后端接口尚未完成的情况下进行开发 这极大地提高了开发效率 为什么要使用Mock js 在传统的前后端协同开
  • 【Linux】高级IO和多路转接

    多路转接和高级IO 咳咳 写的时候出了点问题 标点符号全乱了 批量替换了几次 干脆就把全文的逗号和句号都改成英文的了 不然代码块里面的代码都是中文标点就跑不动了 1 高级IO 1 1 五种IO模型 用钓鱼佬的栗子 来看看五种不同的IO模型吧
  • 新一代烧写工具—STM32CubeProgrammer!

    STM32CubeProgrammer STM32CubeProg 是STM32微控制器的专用编程工具 STM32用户都知道 当完成程序调试 需要对芯片进行程序代码烧录编程 一般会有三个选择 通过调试接口 JTAG SWD 来烧写程序 一般
  • 漏洞扫描服务内容、方式以及流程一篇了解

    漏洞扫描是指基于漏洞数据库 通过扫描工具 人工的方式对客户信息系统的资产 包含网络设备 安全设备 主机系统 web应用 数据库系统等 进行全面 深入的安全脆弱性检测 检测完成后为客户输出可参考的分析报告及修复方案 具体服务内容 方式以及流程
  • C语言,实现字符串移动,例如char str[]=“AGAB%Sr67gs5ffwt+%“ 得到结果是“AABGS567grstw%%+“

    实现字符串移动 例如char str AGAB Sr67gs5ffwt 得到结果是 AABGS567grstw 1 1 先对字符串实现升序排序 voidSort char p int n 1 2 从字符串中挑出大写 char DaXie c
  • boot-admin整合Quartz实现动态管理定时任务

    淄博烧烤爆红出了圈 当你坐在八大局的烧烤摊 面前是火炉 烤串 小饼和蘸料 音乐响起 啤酒倒满 烧烤灵魂的party即将开场的时候 你系统中的Scheduler 调试器 也自动根据设定的Trigger 触发器 从容优雅的启动了一系列的Job
  • Taro转支付宝小程序问题总结

    1 ios系统出现跳转两次的问题 解决 新建project alipay json 中设置 enableAppxNg true enableNodeModuleBabelTransform true 2 二级页面 页面凹陷进顶部 导航栏透明
  • [机器学习与scikit-learn-34]:算法-分类-支持向量机SVM的基本简介与基本原理-线性分类

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123778715 目录 第1章 支持向
  • 一个项目的基本要素都有哪些?

    在规划项目时 必须要慎重考虑项目的五要素 那么项目的五要素是什么 一个成功的项目经理必须对这五个要素有相当程度的了解 才能更好更高效的完成项目 在五个要素中 项目的范围和组织结构为最基本要素 质量 时间 成本是约束要素 1 项目的范围 项目
  • JDBC纯驱动方式连接MySQL

    1 新建一个名为MysqlDemo的Java Project 2 从http dev mysql com downloads connector j 中下载最新的驱动包 这里有 tar gz和 zip两种格式的包 因为在windows下都可
  • 递归删除符合条件的目录,文件, kotlin,java

    package a import java io IOException import java nio file import java nio file attribute BasicFileAttributes fun main ar
  • Linux和华为欧拉系统下安装mysql-5.7.30详细步骤

    大家好 又见面了 我是你们的朋友全栈君 Hello everyone see you again I m your friend Quan Zhanjun Detailed steps to install mysql 5 7 30 und
  • java.sql.array 初始化_Java数组学习

    Java数组学习 数组的定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干个数据 按照一定的先后次序排列组合而成 其中 每一个数据称作一个数组元素 每个数组元素可以通过一个下标来访问它们 数组的下标从0开始 数组声明创建 首先必
  • 应用程序无法正常启动(0x000007b)

    应用程序无法正常启动 0x000007b 请单击 确定 关闭应用程序 错误代码 0x000007b 是 Windows 操作系统中的一个常见错误代码 它通常与应用程序或操作系统文件的错误 损坏或不匹配相关联 这个错误代码可能会导致应用程序无
  • 正则表达式清理日志

    字段提取中正则表达式的使用 提取日志中的信息格式 lt 字段名称 gt 匹配具体信息的正则表达式 日志样例 lt 78 gt 2019 08 21T17 10 01 461970 08 00 localhost CROND root CMD
  • en结尾的单词_【第24集】en结尾的不规则动词变化

    这一集我们来看一下另一种不规则动词的变化 en 结尾 当然 这里en结尾 并不是说这个单词是en结尾 只是发音是en这样的不规则动词 那么这写不规则动词有哪些呢 我们来总结一下 tear 原形 tore 过去式 torn 过去分词 撕开 什
  • 如何在sublime Text3实时运行js代码?

    安装Node js https nodejs org en 为sublime text3添加编译系统 Tools gt Build System gt New Build System 在打开的界面中添加 cmd node file sel
  • UPnP协议学习

    UPnP架构定义了两种类型的设备 控制设备 controlled devices 和控制点 control points 控制设备扮演服务器的角色 响应控制点的请求 控制点和控制设备都能在各种平台包括个人电脑和嵌入式设备中实现 多个控制设备
  • C#8.0本质论第四章--操作符和控制流程

    C 8 0本质论第四章 操作符和控制流程 4 1操作符 有些操作符以符号的形式出现 例如 或者 等 而另一些操作符则为关键词 例如default和is 4 1 1一元正负操作符 一元正操作符 对值几乎没有影响 它在C 中是多余的 4 1 2