一、内存

变量存储在堆栈中。它引用的数据可以位于栈(结构)或堆(类)上。结构体也可以装箱,这样对象就会在堆上创建。垃圾收集器需要从托管堆中释放不再需要的非托管对象。使用本机API,可以在本机堆上分配内存。垃圾收集器不负责在本机堆上分配内存。必须自己释放这些内存。关于内存,有很多东西需要考虑。

使用托管环境时,很容易被误导,注意不到内存管理,因为垃圾收集器(GC)会处理它。很多工作都由GC完成;了解它是如何工作的,什么是大小对象堆,以及什么数据类型存储在堆栈上是非常有益的。同时,垃圾收集器处理托管的资源,那么非托管资源呢?它们需要由开发人员释放。程序可能是完全托管的程序,但是框架的类型呢?例如,文件类型包装了一个本地文件句柄。这个文件句柄需要释放。为了尽早释放这个句柄,最好了解IDisposable接口和using语句。

其他方便也很重要。尽管一些语言结构更易于创建不可变的类型,但可变对象也有优势。string类是自.NET Framework 1.0以来一直可用的不可变类型。现在我们经常需要处理大的字符串。在操作字符串时,GC需要清理许多对象。直接访问字符串的内存并进更改,将使程序可变,在不同的场景中具有更好的性能。Span类型使之成为可能。对于数组,还介绍了ArrayPool类,该类还可以减少GC的工作量。

本章介绍内存管理和内存访问的各个方面。如何很好地理解了内存管理和C#提供的指针功能,也就能很好地集成C#代码和原来的代码,并能在非常注重性能的系统中高效地处理内存。本章介绍了使用C# 7中的ref关键字作为返回类型和本地变量的新方法。这个特性减少了对使用不安全代码和C#中指针的需要。本章还讨论了使用Span类型访问不同类型内存的更过细节,例如托管堆、本机堆和堆栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值