您的位置:首页 > 编程语言 > C#

《C#图解教程》读书笔记8-9章——表达式和运算符、语句

2009-09-04 22:31 399 查看
这本书讲解 C# 语言十分详细,我将其中的重要内容整理成条款,以备忘。

 

1.       编译器会把数字字符串解释为能表示该值但不丢失数据的相应类型中最小的类型。无后缀 的实数字面量是 double 类型,不是 float 类型。逐字字符串唯一的例外是相邻的双引号组 ,它们被解释为单个双引号字符 。
 
2.       赋值和条件运算符是右结合性的,其他二元运算符是左结合性的。求余运算符还可以用于实数得到实余数。
 
3.       在进行比较操作时,大多数进行引用 比较,即比较,若引用相同 则表明它们指向内存中相同对象 ,比较结果为 true ,否则为 false ,即使内存中两个分离的对象在所有其他方面都完全相等。 string 类型对象虽是引用类型,但比较相等性时,比较长度和大小写敏感的内容,即使,它们占用不同的内存区域,这是深比较。可参见 P145 。委托 也使用深比较。编译器通过让相同的字符串字面量共享堆中同一位置 以节约内存。
 
4.       逻辑运算符 (&& 、 ||) 存在“短路”行为,不要在第二个表达式中放置带有副作用的表达式 ( 比如改变一个值 ) ,因为它可能不被求值 。
 
5.       底层硬件使用一种二进制补码来表示有符号二进制数。在二进制补码表示法中,正数使用正常的二进制形式,若要取一个数的相反数,把这个数取反再加 1 。对于有符号整数时,如果操作数最左边比特位是 1( 标志一个负数 ) ,右移后最左边的位置填 1 ,对于正数或无符号数,则填 0 。
 
6.       用户定义的类型转换运算符分为显式的和隐式的,隐式转换编译器会自动执行,而显式转换,只在使用显式转换运算符时 才执行转换。 public 和 static 是所有用户定义转换必须的,格式为 public static [implicit] / [explicit] TargetType ( SourceType Identifier ) {  return ObjectOfTargetType  } ,这和使用时的顺序是一致的,如: (TargetType ) Identifier 。
 
7.       C# 运算符被定义为使用预定义类型作为操作数来工作,如果面对一个用户定义类型,运算符无法处理,运算符重载允许定义 C# 运算符应该如何操作自定义类型的操作数 。运算符重载只能用于类和结构 。为类或结构重载一个运算符 x ,可以声明一个名称为 operator x 的方法实现。
 
8.       二元运算符的重载方法带有两个参数,其中至少有一个必须是 class 或 struct 类型 ,方法必须带有 static 和 public 两个修饰符。
 
9.       赋值 运算符、 new 运算符和 typeof 运算符不能重载 ,自增和自减运算符可以被重载,但重载后前置和后置没有区别。运算符重载不能做下面的事情:创建新运算符;改变运算符的语法;重新定义运算符如何处理预定义类型;改变运算符的优先级或结合性。
 
10.   应用条件运算符 ( ? : ) 时应把条件和每个返回值放在分离的行,这样做操作意图使人容易理解。
 
11.   typeof 运算符返回作为它的参数的任何类型的 System.Type 对象,通过这个对象,可以获得类型的特征。当通过任何类型的任意对象调用 GetType 方法时, typeof 运算符都会被调用。
 
12.   语法块在语法上算做一个单条嵌入语句 ,任何语法上需要一个嵌入语句的地方,都可以使用语法块。
 
13.   空语句只由一个分号组成,用在语法需要一条嵌入语句而程序逻辑又不需要任何动作的地方。 continue 只用于循环 语句中。
 
14.   C# 中 switch 的每个分支必须以 break 或 return 语句结束,在 C# 中,没有从一个分支到下一个分支的贯穿。一个 switch 可以有 0 或任意个分支,分支后必须是编译期可被求值的常数表达式,如果标签之间没有可执行语句,则会贯穿到下一个分支,反之必须用 break 或 goto 结束一个分支,若采用 goto 还可实现贯穿,如: goto caes 2 ;
 
15.   注意 do … while 的 while 条件括号后面的分号是必须的 ,在 for 循环的初始化语句中声明的变量的生命期只维持到它所在的循环结束。 for 循环中的 Initializer 只被执行一次 ,而 Iteration 表达式在 Statement 之后并且在返回到循环顶端的条件表达式之前 都会被立即执行,它不受 continue 语句的控制 。
 
16.   标签语句有一个标识符,一个冒号,一条语句组成,它的执行完全如同标签不存在一样,并仅执行语句部分。给语句增加一个标签允许控制从代码的另一部分转移到该语句,标签语句只允许用在块内部
 
17.   标签语句中的标识符可以是任何有效的标识符,包括在合法范围内已经声明的标识符,如:局部变量或参数名。但标签的标识符不能和它所在范围内的另一个标签标识符相同 ,也不能是关键字。
 
18.   标签的可见性范围包括:它的声明所在的块;任何嵌套在该块的内部的语句或语句块,从范围内部的任何位置都能跳到标签语句,但从外部不能跳入到标签语句的块。
 
19.   goto 语句无条件 转移到一个标签语句, goto 语句必须在标签语句的范围之内 ,即 goto 语句 只能跳到范围大于等于 它的标签语句 。
 
20.   using 语句简洁地封装了资源的使用,所说的资源 是指实现了 System.IDisposable 接口的类或结构 ( 因为需要使用到 IDisposable 接口中的 Dispose 方法 ) ,如果在正在使用资源的代码中产生一个意外的运行时错误 ( 抛出异常 ) ,则处理释放资源的代码可能得不到执行。将分配资源的代码放入括号中,块中放置使用资源的代码,编译器接受 using 语句的元素并产生隐式的 try … finally 以处理潜在的异常。资源的分配、使用、处理都被封装到一个隐式块中,当 finally 退出后资源失效并保证不会再使用该资源。
 
21.   为了及早释放对象所占用非托管资源 ,因此要保证 Dispose 方法能在对象被使用后调用,但 using 语句只负责执行所包含资源的一些操作,然后释放掉,并不能够处理 using 语句块中的异常,如果担心块内部发生异常,要编写 try-catch 块以处理相应的异常。
 
22.   using 语句还可以被用于相同类型 个资源,资源声明用逗号 隔开,另外 using 语句还可以被嵌套
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息