《C#从现象到本质》读书笔记(五)第5章字符串
字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是引用传递,值都会发生变化。
字符串的==操作符被重写为比较字符串的值而不是其引用。
当使用代码将字符串变量等于一个新的值时,堆上会出现一个新的字符串,然后,栈上的变量指向该新字符串。没有任何办法更改原来字符串的值。由于字符串所有非私有的属性和字段都是只读或常量,也没有任何办法修改字符数组的值,字符串的值也就不可能改变了。
大部分情况下,运行速度:StringBuilder>StringBuffer>String。其中,StringBuffer线程安全,StringBuilder非线程安全。
String适用于少量的字符串操作的情况。
StringBuilder适用于单线程下在字符缓冲区进行大量操作的情况。
StringBuffer适用于多线程下在字符缓冲区进行大量操作的情况。
第6章垃圾回收
C#中,使用new关键字,即可完成为资源分配内存的动作。
垃圾回收(GC)会做两件事:通过某种算法,识别内存中的垃圾;将垃圾回收并使得空间可以再度利用。
局部性指的是,由于多个对象被分配在相近的内存中,导致缓存命中率提高,从而提升程序性能的一种性质。
C#的全套GC,即标记压缩法。GC使用的垃圾回收算法是,先标记,之后将垃圾清理、释放,将幸存者升代,最后压缩,使得垃圾释放空出来的位置变得连续。
使用using关键字可以保证对象离开using块时,CLR会自动调用它的Dispose方法。using关键字只能用于那些实现了IDisposible接口的对象。
怎样实现垃圾回收策略:
1)使用using关键字简化代码,并调用Dispose方法作为保证。
2)如果类型中都是托管资源,而且也不存在任何成员继承了IDisposible接口,那么什么都不用做。
3)如果类型中都是托管资源,存在成员继承了IDisposible接口,那么类型本身也应该继承IDisposible接口,然后在Dispose方法中逐一调用成员的Dispose方法。
4)如果类型含有非托管资源,则:
a)类型应当继承IDisposible接口。
b)写一个私有方法,在方法中释放托管资源和非托管资源。
c)实现Dispose方法,调用私有方法,之后调用GC.SuppressFinalize防止析构函数被调用。
d)实现一个析构函数,在其中调用私有方法。
GC有2中不同的工作模式:工作站模式和服务器模式。按照GC线程的工作方法,又可以分为并发方式和非并发方式。在工作站模式上,可以运行并发方式和非并发方式,而在服务器模式上,只能运行非并发方式。
第7章异常与异常处理
提高程序的健壮性。
throw与throw ex的区别在于,后者会把调用栈重置,而前者不会更改调用栈。