C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换

时间:2021-07-15 09:48:29

第六章 运算符和类型强制转换

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#高级编程 (第六版) 学习 第六章:运算符和类型强制转换的更多相关文章

  1. C&num;高级编程笔记 2016年10月8日运算符和类型强制转换

    1.checked和unchecked 运算符 C#提供了checked 和uncheckde 运算符.如果把一个代码块标记为checked, CLR就会执行溢出检查,如果发生溢出,就抛出overfl ...

  2. c&num;高级编程第七版 学习笔记 第一章 &period;NET体系结构

    第一章      .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...

  3. c&num;高级编程第七版 学习笔记 第二章 核心c&num;

    第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...

  4. C&num;高级编程9-第7章 运算符和类型强制转换

    运算符和类型强制转换 1.运算符 运算符的简化操作 条件运算符: if-else的简化操作,也称三元运算符.如果条件为真,返回一个值,为假返回另外一个值. condition?true_value:f ...

  5. C&num;高级编程 &lpar;第六版&rpar; 学习 第七章:委托和事件

    第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...

  6. C&num;高级编程 &lpar;第六版&rpar; 学习 第五章:数组

    第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...

  7. C&num;高级编程 &lpar;第六版&rpar; 学习 第四章:继承

    第四章 继承 1,继承的类型 实现继承: 一个类派生于一个基类型,拥有该基类型所有成员字段和函数. 接口继承 一个类型只继承了函数的签名,没有继承任何实现代码.   2,实现继承 class MyDe ...

  8. C&num;高级编程 &lpar;第六版&rpar; 学习 第三章:对象和类型

    第三章 对象和类型 1,类和结构 类存储在托管堆上 结构存储在堆栈上   2,类成员 类中的数据和函数称为类成员 数据成员 数据成员包括了字段.常量和事件   函数成员 方法:与某个类相关的函数,可以 ...

  9. c&num;高级编程第七版 学习笔记 第三章 对象和类型

    第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 ...

随机推荐

  1. Python之路-python&lpar;css、JavaScript&rpar;

    css JavaScript 一.CSS 分层: position: fixed;(固定到页面的具体位置) 例如:返回顶部 <!DOCTYPE html> <html lang=&q ...

  2. Atitit。木马病毒原理机密与概论以及防御

    Atitit.木马病毒原理机密与概论以及防御 1. 定时截屏木马1 1.1. QQ聊天与微信聊天木马1 2. 文档木马1 3. 病毒木马的触发方式2 4. 远程木马2 5. 漏洞木马2 6. 病毒木马 ...

  3. iOS开发——生成二维码——工具类

    啥也不说,直接上源码,拷过去就能用.生成二维码的工具类使用方法在ProduceQRCode.h里有示例说明 分别将下面的ProduceQRCode.h和ProduceQRCode.m对应的代码考到自己 ...

  4. Struts2技术内幕-----第七章

    1)基于人机交互的请求--响应模式主要由哪三大要素构成?     ①沟通协议-----人和机器都能够明白的数据通信格式     ②请求内容-----人通过某种机制向机器发起的数据请求     ③响应内 ...

  5. YII学习笔记-登录后的session的总结

    在YII框架的默认的登录后的session数据是id,name,__states这三个数据. 在搭配好YII框架环境后,可以使用admin/admin,来登录系统.如果在protected/views ...

  6. HTML5-WebSocket-初探

    1.环境准备 主要是用<HTML5 程序设计>(第二版)作为学习参考资料.但是上面用的WebSocket服务器是用python写的.偶不懂python,于是得找另外一个替代实现,这里适用n ...

  7. (数字IC)低功耗设计入门(五)——RTL级低功耗设计(续)

    二.RTL级低功耗设计(续) 前面一篇博文我记录了操作数隔离等低功耗设计,这里就主要介绍一下使用门控时钟进行低功耗设计. (4)门控时钟 门控时钟在我的第一篇博客中有简单的描述,这里就进行比较详细的描 ...

  8. 【一天一道LeetCode】&num;62&period; Unique Paths

    一天一道LeetCode系列 (一)题目 A robot is located at the top-left corner of a m x n grid (marked 'Start' in th ...

  9. Android代码书写规范

    1.资源文件命名规则2.类名文件命名规则3.尽量少用枚举4.public方法.重要逻辑.主要类结构体必须注释,其他部分可自定注释5.提交代码必须描述清楚修改内容,如果一次提交内容过多,拆分功能进行多次 ...

  10. 小程序 - API 踩坑记录(更新中&period;&period;&period;)

    API 小程序API结构导览图: 声明: 请尊重博客园原创精神,转载或使用图片请注明: 博主:xing.org1^ 出处:http://www.cnblogs.com/padding1015/