天天看点

Pattern之Dispose

Pattern之Dispose
Pattern之Dispose

Code

Pattern之Dispose

    public class MyResource: IDisposable

Pattern之Dispose
Pattern之Dispose
Pattern之Dispose

{

Pattern之Dispose

        // Pointer to an external unmanaged resource.

Pattern之Dispose

        private IntPtr handle;

Pattern之Dispose

        // Other managed resource this class uses.

Pattern之Dispose

        private Component component = new Component();

Pattern之Dispose

        // Track whether Dispose has been called.

Pattern之Dispose

        private bool disposed = false;

Pattern之Dispose
Pattern之Dispose

        // The class constructor.

Pattern之Dispose

        public MyResource(IntPtr handle)

Pattern之Dispose
Pattern之Dispose
Pattern之Dispose

{

Pattern之Dispose

            this.handle = handle;

Pattern之Dispose

        }

Pattern之Dispose
Pattern之Dispose

        // Implement IDisposable.

Pattern之Dispose

        // Do not make this method virtual.

Pattern之Dispose

        // A derived class should not be able to override this method.

Pattern之Dispose

        public void Dispose()

Pattern之Dispose
Pattern之Dispose
Pattern之Dispose

{

Pattern之Dispose

            Dispose(true);

Pattern之Dispose

            // This object will be cleaned up by the Dispose method.

Pattern之Dispose

            // Therefore, you should call GC.SupressFinalize to

Pattern之Dispose

            // take this object off the finalization queue

Pattern之Dispose

            // and prevent finalization code for this object

Pattern之Dispose

            // from executing a second time.

Pattern之Dispose

            GC.SuppressFinalize(this);

Pattern之Dispose

        }

Pattern之Dispose
Pattern之Dispose

        // Dispose(bool disposing) executes in two distinct scenarios.

Pattern之Dispose

        // If disposing equals true, the method has been called directly

Pattern之Dispose

        // or indirectly by a user's code. Managed and unmanaged resources

Pattern之Dispose

        // can be disposed.

Pattern之Dispose

        // If disposing equals false, the method has been called by the

Pattern之Dispose

        // runtime from inside the finalizer and you should not reference

Pattern之Dispose

        // other objects. Only unmanaged resources can be disposed.

Pattern之Dispose

        protected virtual void Dispose(bool disposing)

Pattern之Dispose
Pattern之Dispose
Pattern之Dispose

{

Pattern之Dispose

            // Check to see if Dispose has already been called.

Pattern之Dispose

            if(!this.disposed)

Pattern之Dispose
Pattern之Dispose
Pattern之Dispose

{

Pattern之Dispose

                // If disposing equals true, dispose all managed

Pattern之Dispose

                // and unmanaged resources.

Pattern之Dispose

                if(disposing)

Pattern之Dispose
Pattern之Dispose
Pattern之Dispose

{

Pattern之Dispose

                    // Dispose managed resources.

Pattern之Dispose

                    component.Dispose();

Pattern之Dispose

                }

Pattern之Dispose
Pattern之Dispose

                // Call the appropriate methods to clean up

Pattern之Dispose

                // unmanaged resources here.

Pattern之Dispose

                // If disposing is false,

Pattern之Dispose

                // only the following code is executed.

Pattern之Dispose

                CloseHandle(handle);

Pattern之Dispose

                handle = IntPtr.Zero;

Pattern之Dispose
Pattern之Dispose

                // Note disposing has been done.

Pattern之Dispose

                disposed = true;

Pattern之Dispose
Pattern之Dispose

            }

Pattern之Dispose

        }

Pattern之Dispose
Pattern之Dispose

        // Use interop to call the method necessary

Pattern之Dispose

        // to clean up the unmanaged resource.

Pattern之Dispose

        [System.Runtime.InteropServices.DllImport("Kernel32")]

Pattern之Dispose

        private extern static Boolean CloseHandle(IntPtr handle);

Pattern之Dispose
Pattern之Dispose

        // Use C# destructor syntax for finalization code.

Pattern之Dispose

        // This destructor will run only if the Dispose method

Pattern之Dispose

        // does not get called.

Pattern之Dispose

        // It gives your base class the opportunity to finalize.

Pattern之Dispose

        // Do not provide destructors in types derived from this class.

Pattern之Dispose

        ~MyResource()

Pattern之Dispose
Pattern之Dispose
Pattern之Dispose

{

Pattern之Dispose

            // Do not re-create Dispose clean-up code here.

Pattern之Dispose

            // Calling Dispose(false) is optimal in terms of

Pattern之Dispose

            // readability and maintainability.

Pattern之Dispose

            Dispose(false);

Pattern之Dispose

        }

Pattern之Dispose

    }

Pattern之Dispose

1.managed resources和unmanaged resources的区别?

通过.Net framework class使用的都是managed resource;unmanaged resource只有在你使用Win32 API才有可能得到

2. 为什么需要显式释放managed resources?

有时managed resources占用太多资源,需要尽早释放

3.什么时候也需要实现析构函数即Finalize?

不要实现除非拥有unmanaged resources.实现Finalize会使对象的回收时间推迟

转载于:https://www.cnblogs.com/wyong27/archive/2009/03/29/1424224.html