抛弃无所谓的对象
虽然 GC 可以帮助我们很好的管理内存,并且高效的将用不到的对象清理出去,但是这并不意味着我们可以随意创建对象。尤其是在方法中创建很多局部引用对象很有可能会降低程序的性能。 GC 的执行时机与程序所分配的内存数量以及分配的频率有关系,如果总是分配内存就会给 GC 造成很大的压力,从而使得 GC 会运行的很频繁进而降低了程序的性能。一般来说我们会将实现了 IDisposable 接口的类型中的变量提升为成员变量,而非局部变量,并且在类中实现这个接口(这种多用于局部变量是引用类型,且出现在需要频繁运行的 routine 中)。此外,如果在程序中有很多地方都需要用到某个 引用类型 的实例的话,我们就可以将它设置为静态成员变量,这样只有在第一次调用它时才会将其创建出来,以后每次的调用都不会再创建它,直到没有任何地方使用到它后 GC 会将其回收。这种方法虽好,但是也存在一定的风险,有可能会导致对象在内存中呆的时间很久,还意味着开发人员无法释放非托管资源,因为开发人员并不能确定什么时候调用 Dispose 方法。
这里要单独提一下 string ,string 类型是不可变的,在我们创建完字符串后这个字符串就无法再修改,当我们利用 += 操作符对 string 类型的对象进行拼接并赋值的时候,其实执行的时创建对象并将原来的 string 对象的值以及要拼接的值作为一个整体赋值给新创建的对象,这样原先的 string 对象就变为了垃圾,看似这种没问题其实在进行大量字符串拼接的时候会严重影响到系统的性能。要解决这个问题我们有两种方式,一种是我曾今讲过的内插字符串来实现字符串拼接,另一种是利用 StringBuild 类,StringBuild 是一种可变的字符串它提供了针对字符串的修改机制。我们在开发中可以根据 StringBuild 的这个设计思路来设计我们的 build ,令开发人员可以分阶段的来创建不可变类型。
总结
本篇文章是比较简单的,但是是一个比较重要的内容,好多开发人员会在这个地方摔倒,爬起来后也不知道为什么摔倒。
Tip 喵叔推荐优质课