zoukankan      html  css  js  c++  java
  • CLR via C# 读书笔记 51 何时对托管资源使用Finalize

    Finalize方法常用于回收非托管资源,以防止资源泄露

    在较少的情况下它也会被用于托管资源

    1.构造函数中如果抛出异常, 那么只有Finalize方法才会被执行,在这里可以回收一些已经分配的资源

    (Dispose不会被执行!!!)当然:Finalize方法的执行时间还是下一次GC的时候(依然不确定时间)

    如果不实现该方法将会造成资源泄露

    以下代码演示了在这种情况

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Diagnostics;
    using System.Reflection.Emit;

    using Oracle.DataAccess.Client;
    using System.Runtime.InteropServices;
    using System.Collections.Concurrent;
    namespace ClassLibrary1
    {


    public class SourceClass
    {

    [STAThread]
    static void Main(string[] args)
    {
    try
    {
    using (ClassA a = new ClassA())
    {
    }
    }
    catch (Exception)
    {

    }
    try
    {
    ClassB a
    = new ClassB();
    }
    catch (Exception)//这可不是一个代码好习惯, 只是为了测试才做成这样
    {

    }
    Console.WriteLine(
    "Collect");
    GC.Collect();
    Console.WriteLine(
    "End");
    //在我的机器上输出结果依次是
    //Collect
    //End
    //Finalize
    Console.ReadLine();
    }
    internal class ClassA : IDisposable
    {
    public ClassA()
    {
    throw new Exception("Just A Test");
    }

    public void Dispose()
    {
    Console.WriteLine(
    "Dispose");
    }
    }
    internal class ClassB
    {
    public ClassB()
    {
    throw new Exception("Just B Test");
    }

    ~ClassB()
    {
    Console.WriteLine(
    "Finalize");
    }
    }
    }
    }

    所以一般情况下为了完全避免资源泄露例如Memory leak, 通常将类实现为以下的方式

    代码
    internal class ClassA : IDisposable
    {
    public ClassA()
    {
    throw new Exception("Just A Test");
    }

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

    public void Dispose(bool disposing)
    {
    //do something
    Console.WriteLine("Dispose");
    }

    ~ClassA()
    {
    this.Dispose(false);
    }
    }
  • 相关阅读:
    java-logic====吃货联盟
    jsp---》》》新闻发布系统的项目跟踪+++++++文件上传
    jsp---tomcat===》》内置对象
    JS中两个节点的关系
    HTML第二本书学习后记
    JavaScript:编程改变文本样式
    JavaS:网页中的显示和隐藏
    第一次做网页设计遇到的问题总结
    HTML中添加背景音乐
    表格的结构标记
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/1897586.html
Copyright © 2011-2022 走看看