《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第8章 表达式和运算符 笔记
表达式
表达式除了返回一个值以外的功能,称为副作用,比如分配内存,又比如赋值表达式设置左边操作数的值是它的副作用。
字面值
整数字面值后辍:
整数字面值的类型是,后辍对应的类型中,能容纳这个值的最小的类型。
浮点数字面值后辍:
字符字面值有四种:
\x和\u都后跟4位十六进制数。
- 经测试\x和\u完全没有区别,编码为UCS-2 BE。'\x4E2D'和'\u4E2D'都输出
中
,测试环境为Intel CPU。
转义序列:
@前辍的字符串是逐字字符串:
- 转义序列不被求值。
- 支持换行符。
- 连续的两个引号解释为一个引号。
除了rst3和vst3,以下逐字字符串与普通字符串有完全相同的输出:
C#编译器使得相同的字符串字面值占堆中同一块内存。
运算符
运算符优先级:
运算符结合性:
C#求余运算符%支持浮点数。
与C/C++不同,C#中数字不具有布尔意义。
相等运算符比较引用类型时,除了比较string和委托使用深比较,其他都使用浅比较。
- 浅比较只比较引用的地址。
- 深比较只比较引用指向的内存中的数据。
C#中&&和||是短路运算符,当左边的表达式足以确定返回值时,右边的表达式不求值。
C#中右移运算符,对于有符号整数符号位填充,对于无符号整数0填充。
if...else语句执行两个行为其中一个,条件运算符返回两个值其中一个。
自定义类型转换
C#支持自定义类型转换,隐式转换由编译器依据上下文自行调用,显式转换在使用强制转换运算符时调用。
自定义类型转换的语法:
- 显式转换使用explicit关键字,隐式转换使用implicit关键字。
- 无论是显式转换还是隐式转换,public和static修饰符都是必需的。
- 源类型与目标类型不能相同。
运算符重载
运算符重载的参数至少要有一个是所属的类或结构类型,语法如下:
- public和static修饰符是必需的。
可重载的运算符:
- 强制转换计入自定义类型转换,不计入运算符重载。
typeof运算符
typeof运算符与实例的GetType()方法相同,返回System.Type对象,直接打印这个对象会输出类型名。通过GetFields()和GetMethods()方法,还可以获得字段成员和方法成员信息:
- FieldInfo和MethodInfo在System.Reflection命名空间中定义。
