• 近期几个ASP.NET开发经验(二)


    一:IHttpModule的Init()只执行一次:
    IHtttpModule.Init()方法是在Application启动时进行一些初始化操作,因此,该方法只需要而且也只会执行一次.
    因此,在该方法里调用的方法也只会执行一次(我们可以在其中实现Timer,FileSystemWatcher等的操作).
    当然,其中的Application相关事件是在这一步注册.
    ----
    需要注意的是,有些情况下,Init()也会多次执行,比如使用框架时就会执行不止一次...
    http://www.cnblogs.com/redfire0922/archive/2007/03/15/675549.html
    这里有位朋友就碰到类似问题.

    二:内存回收,Dispose,Close,Finalie(C#中的析构函数)
    .NET中的资源分托管和非托管,所谓的托管是指CLR(通用语言运行时)中进行管理的资源,它可以由CLR自动进行内存回收.
    也就是大家熟知的GC(垃圾回收机制).
    而对于 非托管资源,比如数据库连接,COM连接等,那么需要手动清理回收资源.
    清理非托管资源,我们可以用析构函数来执行,虽然它的执行时机不确定,但终究会被执行.
    当然还有Dispose()和Close()方法,两者的区别在于,Close()后还要以用Open()打开,而Dispose()则是彻底销毁.

    ---
    使用析构函数时,需要GC.Collect()才会执行到(GC,Collect()在自动回收机制中会自动执行,也可以显式调用它)
    而Dispose()需要显式地调用,或者使用using()
    ,但是,需要注意:在用析构函数时,至少分两步走:调用函数,回收内存.
    那么,在用using()或*.Dispose()后,GC还会再去执行析构函数.
    因此,在Dispose()里,加上GC.SupressFinalize(this)来防止再次调用析构函数.

    总结:
    Dispose()和Close()需要显示调用,Dispose()可以通过using()调用.析构函数无法显式调用.
    Dispose()和析构函数是销毁对象,而Close()是关闭,可以通过Open()再开.
    析构函数调用时机不确定,而Dispose()在显式或Using()时执行,Close()在显式时执行.
    三者都是用来销毁非托管对象.
    一段经典的C#-Dispose:
     1private bool _isDisposed=false;
     2~MyTest()
     3        {
     4            //this.Close();
     5            Dispose(false);
     6        }

     7        /// <summary>
     8        /// 内存释放,需要此类实例显式调用,如sql.Dispose();或Using()
     9        /// </summary>

    10        public void Dispose()
    11        {
    12            //IDisposable dispose = this as IDisposable;
    13            //if(dispose!=null)
    14            //{
    15            //    dispose.Dispose();
    16            //}
    17            Dispose(true);
    18            GC.SuppressFinalize(this);
    19        }

    20        protected virtual void Dispose(bool disposing)
    21        {
    22            if(!_isDisposed)
    23            {
    24                if(disposing)
    25                {
    26               //托管资源的释放    
    27                }

    28               //非托管资源的释放
    29                _isDisposed = true;
    30            }

    31        }
  • 相关阅读:
    升级centos6.5系统的gcc为4.8.5的简易步骤
    赛车比赛(洛谷U4566)
    月考(cogs 1176)
    xth的旅行(codevs 1450)
    魔法禁书目录2:回家(codevs 3024)
    交换
    牛的旅行(洛谷 1522)
    长途旅行
    序列问题
    正确答案
  • 原文地址:https://www.cnblogs.com/McJeremy/p/1255517.html
Copyright © 2020-2023  润新知