《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理

《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的区别在于,后者会把调用栈重置,而前者不会更改调用栈。

原文地址:https://www.cnblogs.com/Lvkang/p/9692878.html