解决方案 »

  1.   

    1. 个人看法:dispose是实现释放非托管资源的。托管资源由系统控制,不需要考虑释放问题。话说,你为何禁用垃圾回收?
    2。值类型对象,肯定是托管资源。值类型是存在栈空间里的,随着系统入栈出栈,它自然就被释放了。
      

  2.   


    你是怎样“禁用垃圾回收”的?垃圾回收不可能被禁用。如果你把“通知不执行 finalize 操作”叫做“禁用垃圾回收”,这显然是错误的!大多数人口口声声所谓的“释放”其实是人云亦云的梦话。我不知道这些人说的是什么,问了他们也说不清!在dispose中要执行什么动作,每一个类都不一样。但是无论如何,这不是什么必须的动作。如果你不做,在对象的 finalize 操作中还会调用 dispose。所以通常你根本无需画社舔足地去显式调用 dispose 方法。
      

  3.   

    比如说你使用 SqlConnection 对象实例,如果你调用 Dispose 方法,那么就会自动调用其 Close 方法,从而释放物理连接给连接池。因此需要在 Using{ } 中使用它来保证(无论运行中是否抛出异常,都)调用 Dispose,而不是让GC 时再去再 Finalize 过程中自动调用 Dispose,从而避免连接池中的链接“用尽”的情况发生。这里,只有你知道所谓的“释放资源”到底是什么资源,你才能知道调用 Dispose 是否必要。如果没有必要调用,就不要调用 Dispose,因为 Dispose 方法会自动被调用的,用不着你显式调用它。同样地,如果你说“值类型的对象是否需要调用Dispose来释放资源”,我根本无法回答。因为这根本就是瞎掰的问题。你只有看看 Dispose 方法里边到底干了什么,才知道所谓的“释放”到底指什么。不要想当然地瞎猜什么“释放资源”这种看似挺厉害、其实没有内涵的词儿,不要空洞地一遍遍说“释放资源”这种话。
      

  4.   

    1. 在标准dispose模式中,在dispose释放托管资源时,如果有遗漏的托管资源未被释放,此时已经禁用垃圾回收,会有什么后果?
    “如果有遗漏的托管资源未被释放”这个是bug好不好。“禁用垃圾回收”,这个好强大,如果这样,是CLR的bug好不好。
    2. 在标准dispose模式中,值类型对象,未实现IDisposable接口的对象是否需要释放,或者如何释放
    未实现IDisposable接口的对象是否需要释放,这个要问写这个类型的人自己了。
      

  5.   

    抱歉,我没有表达清楚.现在大概理解了,GC回收对象的时候,先调用析构器让对象拥有自主释放资源的能力,再回收对象的成员变量.
    而dispose方法在释放托管资源的时候是自由的,之所以仅在主动调用时释放托管资源是想让对象成员所引用的对象尽快释放.
    而交给GC的话,引用变量会立即释放,但是引用的对象会稍后一些.
    应该是这样吧.