《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第8章 表达式和运算符 笔记

表达式

表达式除了返回一个值以外的功能,称为副作用,比如分配内存,又比如赋值表达式设置左边操作数的值是它的副作用。

字面值

整数字面值后辍:

整数字面值的类型是,后辍对应的类型中,能容纳这个值的最小的类型。

浮点数字面值后辍:

字符字面值有四种:

\x和\u都后跟4位十六进制数。

  • 经测试\x和\u完全没有区别,编码为UCS-2 BE。'\x4E2D'和'\u4E2D'都输出,测试环境为Intel CPU。

转义序列:

@前辍的字符串是逐字字符串:

  1. 转义序列不被求值。
  2. 支持换行符。
  3. 连续的两个引号解释为一个引号。

除了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命名空间中定义。