九、C#笔记

2023-12-14 17:22:47

/// <summary>
/// 第十四章:使用垃圾回收和资源管理
/// </summary>
namespace Chapter14
{
? ? class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //14.1对象生存
? ? ? ? ? ? /*
? ? ? ? ? ? ?* new操作的步骤:
? ? ? ? ? ? ?* 1.首先,new操作从堆中分配原始内存,这个阶段无法进行任何干预。
? ? ? ? ? ? ?* 2.然后,new操作将原始内存转换成对象,这时必须初始化对象。
? ? ? ? ? ? ?*?
? ? ? ? ? ? ?* 对象销毁的过程:
? ? ? ? ? ? ?* 1. .NET“运行时”执行清理工作,可以写一个终结器来加以控制。
? ? ? ? ? ? ?* 2. .NET“运行时”将对象占用的内存归还给堆,解除对象内存分配。
? ? ? ? ? ? ?*?
? ? ? ? ? ? ?* 销毁对象并将内存归还给堆的过程称为垃圾回收
? ? ? ? ? ? ?*/
? ? ? ? ? ? ///14.1.1编写终结器(使用终结器,可在对象被垃圾回收时执行必要的清理)
? ? ? ? ? ? /*
? ? ? ? ? ? ?* 终结器存在以下重要限制:
? ? ? ? ? ? ?* 1.终结器只适合引用类型.值类型(例如struct)不能声明终结器
? ? ? ? ? ? ?* 2.不能为终结器指定访问修饰符(例如public)
? ? ? ? ? ? ?* 3.终结器不能获取任何参数.
? ? ? ? ? ? ?* 4.终结代码只应专注于释放资源.(不要包含任何逻辑)
? ? ? ? ? ? ?*/

? ? ? ? ? ? ///14.1.2 为什么要使用垃圾回收器
? ? ? ? ? ? /*
? ? ? ? ? ? ?* 垃圾回收器的特点是,程序员不知道(也不应依赖)对象的销毁顺序.
? ? ? ? ? ? ?* 需理解的最后一个重点是,终结器只有在对象被垃圾回收时才运行.
? ? ? ? ? ? ?* 终结器肯定会允许,只是不保证在什么时候运行.
? ? ? ? ? ? ?* 所以写代码时,不要对终结器的运行顺序或时间有任何预设.
? ? ? ? ? ? ?*/
? ? ? ? ? ? ///14.1.3垃圾回收器的工作原理 ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? /*
? ? ? ? ? ? ?* 采取的步骤如下:
? ? ? ? ? ? ?* 1.构造所有可达对象的一个映射(map).
? ? ? ? ? ? ?* 2.检查是否有任何不可达对象包含一个需要运行的终结器.需要被终结的任何不可达对象都放在一个称为freachable的特殊队列中.
? ? ? ? ? ? ?* 3.回收剩下的不可达对象(即不需要终结的对象).
? ? ? ? ? ? ?* 4.然后,允许其他线程恢复执行.
? ? ? ? ? ? ?* 5.在一个独立线程中,对需终结的不可达对象执行终结操作.
? ? ? ? ? ? ?*/
? ? ? ? ? ? ///14.1.4慎用终结器
? ? ? ? ? ? /*
? ? ? ? ? ? ?* 写包含终结器的类,会使代码和垃圾回收过程变复杂.
? ? ? ? ? ? ?*/

? ? ? ? ? ? //14.2资源管理
? ? ? ? ? ? /*有些资源过于宝贵,用完之后应马上释放,唯一的选择就是亲自释放资源.*/
? ? ? ? ? ? ///14.2.1资源清理方法
? ? ? ? ? ? TextReader reader = new StreamReader("aa.txt");
? ? ? ? ? ? string line;
? ? ? ? ? ? while ((line = reader.ReadLine()) != null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine(line);
? ? ? ? ? ? }
? ? ? ? ? ? reader.Close();
? ? ? ? ? ? ///14.2.2异常安全的资源清理
? ? ? ? ? ? /*
? ? ? ? ? ? ?* try之后写在finally里面,但是也存在缺点:
? ? ? ? ? ? ?* 略
? ? ? ? ? ? ?* using语句可以解决这些缺点
? ? ? ? ? ? ?*/
? ? ? ? ? ? ///14.2.3using语句和IDisposable接口
? ? ? ? ? ? using (TextReader reader1 = new StreamReader("aa.txt"))
? ? ? ? ? ? ? ? //相当于自己try、finally,省略了finally的关闭(关闭用的Dispose)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? string line1;
? ? ? ? ? ? ? ? while ((line1 = reader.ReadLine()) != null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine(line1);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? /*
? ? ? ? ? ? ?* using语句声明的变量的类型必须实现IDisposable接口在System命名空间中,只包含一个名为Dispose的方法。
? ? ? ? ? ? ?* Dispose方法的作用是清理对象使用的任何资源。
? ? ? ? ? ? ?* 特点『
? ? ? ? ? ? ?* 1.需要清理多个资源时,具有良好的扩展性
? ? ? ? ? ? ?* 2.不影响程序代码的逻辑
? ? ? ? ? ? ?* 3.对问题进行良好抽象,避免重复性编码
? ? ? ? ? ? ?* 4.非常健壮,using语句结束后,就不能使用using语句中声明的变量了,因为它已不在作用域。
? ? ? ? ? ? ?* 』
? ? ? ? ? ? ?*/
? ? ? ? ? ? ///14.2.4从终结器中调用Dispose方法
? ? ? ? ? ? /*
? ? ? ? ? ? ?* 1.类实现了IDispsable就诶口
? ? ? ? ? ? ?* 2.公共Dispose方法可由应用程序代码在任何时候调用
? ? ? ? ? ? ?* 3.公共Dispose方法调用Dispose方法来获取一个Boolean参数的受保护重载版本,
? ? ? ? ? ? ?* 向其传递true,由后者来实际清理资源
? ? ? ? ? ? ?* 4.终结器调用Dispose方法来获取一个Boolean参数的受保护重载版本,
? ? ? ? ? ? ?* 向其传递false。终结器只由垃圾回收器在对象被终结时调用。
? ? ? ? ? ? ?* 5.受保护的Dispose方法可以安全地多次调用。
? ? ? ? ? ? ?* 6.受保护的Dispose方法支持托管资源和非托管资源的清理。
? ? ? ? ? ? ?* 7.公共Dispose方法调用静态GC.SuppressFinalize方法。该方法阻止垃圾回收器为这个对象调用终结器,因为对象已经终结
? ? ? ? ? ? ?* 8.类的所有常规方法都要检查对象是否已清理;是的话,就抛出异常。
? ? ? ? ? ? ?*/

? ? ? ? ? ? //14.3实现异常安全的资源清理
? ? ? ? ? ? //14.4处理异步清理
? ? ? ? ? ? /*await using()
? ? ? ? ? ? ?调用: awit 方法名()
? ? ? ? ? ? ?*/
? ? ? ? }
? ? }
}

namespace Chapter14.Mouble
{
? ? internal class Resource
? ? {
? ? }
}

namespace Chapter14.Mouble
{
? ? class FileProcessor
? ? {
? ? ? ? FileStream file = null;
? ? ? ? public FileProcessor(string fileName)
? ? ? ? {
? ? ? ? ? ? this.file = File.OpenRead(fileName);
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 14.1.1编写终结器
? ? ? ? /// </summary>
? ? ? ? ~FileProcessor()
? ? ? ? {
? ? ? ? ? ? this.file.Close();
? ? ? ? }
? ? }
}
?

namespace Chapter14.Mouble
{
? ? /// <summary>
? ? /// 14.2.4从终结器中调用Dispose方法
? ? /// </summary>
? ? public class Example:IDisposable
? ? {
? ? ? ? private Resource scarce;
? ? ? ? private bool disposed = false;

? ? ~Example()
? ? {
? ? ? ? this.Dispose(false);
? ? }

? ? public virtual void Dispose()
? ? {
? ? ? ? this.Dispose(true);
? ? ? ? GC.SuppressFinalize(this);
? ? }

? ? public virtual void Dispose(bool disposing)
? ? {
? ? ? ? if (!this.disposed)
? ? ? ? {
? ? ? ? ? ? if(disposing)
? ? ? ? ? ? {

? ? ? ? ? ? }
? ? ? ? ? ? this.disposed = true;
? ? ? ? }
? ? }

? ? public void SomeBehavior()
? ? {
? ? ? ? checkIfDisposed();
? ? }

? ? private void checkIfDisposed()
? ? {
? ? ? ? if (this.disposed)
? ? ? ? {
? ? ? ? ? ? throw new ObjectDisposedException("示例:对象已经清理");
? ? ? ? }
? ? }
}
}
?

文章来源:https://blog.csdn.net/H215919719/article/details/134858100
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。