C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换
第六章 运算符和类型强制转换
1,运算符
类别 |
运算符 |
算术运算符 |
+ - * / % |
逻辑运算符 |
& | ^ ~ && || ! |
字符串连接运算符 |
+ |
增量和减量运算符 |
++ -- |
移位运算符 |
<< >> |
比较运算符 |
== != <> <= >= |
赋值运算符 |
= += -= *= /= %= &= |= ^= <<= >>= |
成员访问运算符 |
. |
索引运算符 |
[] |
数据类型转换运算符 |
() |
条件运算符 |
?: |
委托连接和删除运算符 |
+ - |
对象创建运算符 |
new |
类型信息运算符 |
sizeof(只限于不安全代码)is typeof as |
间接寻址运算符 |
* -> &(只用于不安全的代码)[] |
命名空间别名限定符 |
:: |
空结合运算符 |
?? |
sizeof在.Net Framework后不存在了。
checked和unchecked运算符
checked:标识溢出检查,添加编译选项/checked,对所有代码执行溢出检查
unchecked:对标识checked的代码段取消溢出检查。
checked { statements; } |
unchecked { statements; } |
is运算符
检查对象是否与特定的类型兼容。"兼容"表示对象是该类型,或者派生于该类型。若兼容,为true,不兼容,false。
as运算符
用于执行引用类型的显式类型转换。如果转换的类型与指定的类型兼容,转换成功,不兼容,返回false。
sizeof运算符
unsafe { Console.WriteLine(sizeof(int).ToString()); } |
typeof运算符
返回一个特定类型的System.Type对象
可空类型和运算符
可以将值指定为null。
int? a = null;
在比较可空类型时,只要有一个操作数为null,结果就为false。
空结合运算符??
提供一种快捷方式,可以在处理可空类型和引用类型时表示null值。
这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或者引用类型,第二个操作数必须与第一个操作数的类型相同,或者可以隐式转换为一个操作数的类型。
空结合运算符的计算如下:如果第一个操作数不是null,则整个表达式就等于第一个操作数的值。如果第一个操作数的值为null,则表达式的值为第二个操作数的值。
运算符的优先级(从高到低)
组 |
运算符 |
初级运算符 |
() . [] x++ x-- new typeof sizeof checked unchecked |
一元运算符 |
+ - ! ~ ++x --x和数据类型转换 |
乘/除运算符 |
/ * % |
加减运算 |
+ - |
移位运算符 |
<< >> |
关系运算符 |
< > <= >= is as |
比较运算符 |
== != |
按位与 |
& |
按位异或 |
^ |
按位或 |
| |
逻辑与 |
&& |
逻辑或 |
|| |
条件运算符 |
?: |
赋值运算符 |
= += -= *= /= %= &= |= ^= <<= >>= >>>= |
2,对象相等的比较
Object的静态成员ReferenceEquals,测试两个引用是否指向类的同一个实例
虚拟的Equals:按值来比较
静态的Equals:可以处理null的情况
比较运算符==:对值比较值,对引用比较是否指向同一个对象。可重写,执行和Equals相同的逻辑。
调用ReferenceEquals来比较值类型肯定返回false,因为为了调用这个方法,值类型总是需要装箱。
3,运算符重载
public class Vector { private double x = 0; private double y = 0; private double z = 0; public Vector(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } public Vector(Vector rhs) { x = rhs.x; y = rhs.y; z = rhs.z; } public static Vector operator + (Vector lhs, Vector rhs) { Vector result = new Vector(lhs); result.x += rhs.x; result.y += rhs.y; result.z += rhs.z; return result; } } |
C#要求把所有的运算符重载都声明为public和static。不能使用this,不能访问实例成员。
编译器处理运算符重载和处理方法重载的方式是一样的,所以,对于运算符两侧类型不同的,需要定义两个不同的运算符重载函数。
C#不允许重载=,但是在用户重载+-*/&/后,会自动重载相应的+=。。版本。
比较运算符的重载
比较运算符分为三对:
==和!=
>和<
>= 和 <=
C#要求成对重载比较运算符,比较运算符必须返回bool型变量。
可以重载的运算符
类别 |
运算符 |
限制 |
算术二元 |
+*、-% |
|
算术一元 |
+ - ++ -- |
|
按位二元运算符 |
& | % ^ << >> |
|
按位一元运算符 |
! ~ true false |
true和false运算符必须成对重载 |
比较运算符 |
== != >= < <= > |
必须成对重载 |
赋值运算符 |
+= - = *= /= >>= <<= %= &= |= ^= |
不能显式地重载,重载单个时,会隐式重载 |
索引运算符 |
[] |
不能直接重载索引运算符。索引器成员可以 |
数据类型转换运算符 |
() |
不能直接重载,用户定义的数据类型允许定义定制的数据类型转换 |
4,用户定义的数据类型转换
public static implicit operator float (Currency value) { statements; } |
上述代码声明了一个隐式类型转换。
也可使用explicit声明一个显式类型转换
类型之间的数据转换
限制
- 如果某个类直接或者间接继承了另一个类,就不能定义这两个类之间的数据类型转换,
- 数据类型转换必须在源或目标数据类型中定义
数据类型转换应该定义在类型内部,且源代码均可编辑,防止把第三方数据类型引入类中。
C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换的更多相关文章
- C#高级编程笔记 2016年10月8日运算符和类型强制转换
1.checked和unchecked 运算符 C#提供了checked 和uncheckde 运算符.如果把一个代码块标记为checked, CLR就会执行溢出检查,如果发生溢出,就抛出overfl ...
- c#高级编程第七版 学习笔记 第一章 .NET体系结构
第一章 .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...
- c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...
- C#高级编程9-第7章 运算符和类型强制转换
运算符和类型强制转换 1.运算符 运算符的简化操作 条件运算符: if-else的简化操作,也称三元运算符.如果条件为真,返回一个值,为假返回另外一个值. condition?true_value:f ...
- 【读书笔记】C#高级编程 第七章 运算符和类型强制转换
(一)运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ -- 移位运算符 < ...
- C#高级编程 (第六版) 学习 第七章:委托和事件
第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...
- C#高级编程 (第六版) 学习 第五章:数组
第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...
- C#高级编程 (第六版) 学习 第四章:继承
第四章 继承 1,继承的类型 实现继承: 一个类派生于一个基类型,拥有该基类型所有成员字段和函数. 接口继承 一个类型只继承了函数的签名,没有继承任何实现代码. 2,实现继承 class MyDe ...
- C#高级编程 (第六版) 学习 第三章:对象和类型
第三章 对象和类型 1,类和结构 类存储在托管堆上 结构存储在堆栈上 2,类成员 类中的数据和函数称为类成员 数据成员 数据成员包括了字段.常量和事件 函数成员 方法:与某个类相关的函数,可以 ...
随机推荐
- BurpSuite—-Target模块(目标模块)
Target功能 目标工具包含了SiteMap,用你的目标应用程序的详细信息.它可以让你定义哪些对象在范围上为你目前的工作,也可以让你手动测试漏洞的过程,Target分为site map和scope两 ...
- Linux内核程序的编译:模块化编译
内核在编译的时候,可以支持单独模块化编译,只需要一个小小的Makefile即可搞定. 步骤如下: 1.在任意位置创建目录 vim Makefile 2.在Makefile中添加如下代码(我的kerne ...
- idea创建Scala入门HelloWorld
Scala开发环境的搭建 首先到Scala官网下载Scala网址为 https://www.scala-lang.org/download/ 找到下图所示位置:选择相对应的版本的Scala进行下载,这 ...
- Xilinx FPGA高速串行收发器简介
1 Overview 与传统的并行实现方法相比,基于串行I/O的设计具有很多优势,包括:器件引脚数较少.降低了板空间要求.印刷电路板(PCB)层数较少.可以轻松实现PCB设计.连接器较小.电磁干扰降低 ...
- verilog中初值定义
在利用verilog进行开发时,往往需要对某些寄存器进行赋初值,下面根据笔者在设计中遇到的情况进行分析. 例如下面是实现流水灯(4个led),代码如下: module ledrun ( input ...
- WPF MVVM从入门到精通4:命令和事件
原文:WPF MVVM从入门到精通4:命令和事件 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 WP ...
- Luogu1445 [Violet]樱花
题面 题解 $$ \frac 1x + \frac 1y = \frac 1{n!} \\ \frac{x+y}{xy}=\frac 1{n!} \\ xy=n!(x+y) \\ xy-n!(x+y) ...
- OpenStack入门篇(二)之OpenStack架构
1.OpenStack 架构 中间菱形是虚拟机,围绕 VM 的那些长方形代表 OpenStack 不同的模块(OpenStack 叫服务,后面都用服务这个术语),下面来分别介绍. Nova:管理 VM ...
- ElasticSearch 聚合查询百分比
这里用的是es5.6.9 bucket_script :它执行一个脚本,该脚本可以对多桶聚合中的指定度量执行每桶计算,指定的度量标准必须为数字,并且脚本必须返回数值. 官方语法 https://www ...
- thinkphp5 开启多语言
一.配置点击打开链接1.开启语言包功能'lang_switch_on' => true,2.支持的语言列表'lang_list' => ['zh-cn','en-us'],二.语言定义(默 ...