C#中Dispose和Close的区别
1,Close()不应该被定义成virtual。对于这个design pattern,Close()只是用来call那个隐藏的Dispose(),用户不应该改变Close的behavior。对于这个问题, System.IO.Stream也有设计问题。之所以有问题是为了满足向后兼容的需求。See http://msdn2.microsoft.com/en-us/library/ms227422.aspx. 文档里面提到虽然Close()是virtual的,但是不应该被override。
2
3 namespace ConsoleApplication
4 {
5 abstract class MyStream : IDisposable
6 {
7 public MyStream()
8 {
9 m_unmanagedResource = Marshal.AllocCoTaskMem(100);
10 m_bitmap = new Bitmap(50, 50);
11 }
12
13 #region IDisposable Members
14 void IDisposable.Dispose()
15 {
16 Dispose(true);
17 GC.SuppressFinalize(this);
18 }
19
20 protected virtual void Dispose(bool isDisposing)
21 {
22 if (!m_disposed)
23 {
24 if (isDisposing)
25 {
26 m_bitmap.Dispose();
27 }
28 Marshal.FreeCoTaskMem(m_unmanagedResource);
29 m_disposed = true;
30 }
31 }
32
33 public void Close()
34 {
35 ((IDisposable)this).Dispose();
36 }
37
38 ~MyStream()
39 {
40 Dispose(false);
41 }
42
43 private IntPtr m_unmanagedResource; // Unmanaged resource
44 private Bitmap m_bitmap; // IDisposable managed resources
45 private bool m_disposed;
46
47 #endregion
48 }
49
50 class MyDerivedStream : MyStream
51 {
52 public MyDerivedStream()
53 {
54 m_anotherMemory = Marshal.AllocCoTaskMem(20);
55 m_anotherImage = new Bitmap(24, 24);
56 }
57
58 protected override void Dispose(bool isDisposing)
59 {
60 if (!m_disposed)
61 {
62 if (isDisposing)
63 {
64 m_anotherImage.Dispose();
65 }
66
67 Marshal.FreeCoTaskMem(m_anotherMemory);
68 base.Dispose(isDisposing);
69 m_disposed = true;
70 }
71 }
72
73 public static void Main(string[] args)
74 {
75 MyStream aStream = new MyDerivedStream();
76
77 aStream.Close(); // Allowed
78 // aStream.Dispose(); // Cannot compile
79
80 ((IDisposable)aStream).Dispose(); // Allowed
81
82 //
83 // This one works as well, because newStream calls the explicit implemented
84 // IDisposable.Dispose method
85 //
86 using (MyStream newStream = new MyDerivedStream())
87 {
88 //
89 // Do something
90 //
91 }
92 }
93
94 private IntPtr m_anotherMemory;
95 private Bitmap m_anotherImage;
96 private bool m_disposed;
97 }
98 }
99
C#中Dispose和Close的区别相关推荐
- [转] C#中Dispose和Close的区别
当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 首先,Dispose和Close基本 ...
- python中break和continue的区别
python中break和continue的区别 break 结束for 或者while 循环 后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...
- java中separator_java - File.separator和路径中的斜杠之间的区别
java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...
- PHP中self和static的区别,php中self与static的区别
原文链接,猛击这里. php中self与static的区别 通过一些示例,我们可以很容易看出self和static的区别.假定我们有class Car – 它有两个方法,model和getModel. ...
- php 抽象类 接口 区别,PHP中抽象类、接口的区别与选择分析
本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过 ...
- php $this self,php中self与$this的区别
学习php中self与$this的区别. 先来看下parent与self的例子: /* * parent与self的区别 * by www.jbxue.com */ class A{ function ...
- mysql中char与varchar的区别分析(补充一句,int和integer没区别)
转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...
- python中bytearray和java中byte[]的区别_Python经典面试题:说说Python中xrange和range的区别?...
昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了. 废话不多说,开 ...
- python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录
最新文章
- 【Android 逆向】ARM CPU 架构体系 ( ARM 处理器工作模式 | ARM 架构模型 )
- jquery中文参考文档
- 稳定云服务器出租_云主机与独立服务器有哪些不同
- PIE SDK剔除栅格块算法
- 气体润滑轴承matlab分析,气体润滑轴承的研究与发展
- 【转】删除已经存在的 TFS Workspace
- Saying Good-bye to Cambridge Again --by Xu Zhimo
- 小学计算机教室管理制度范本,《中小学微机室规章制度》.doc
- Oracle安装详细教程
- foxit pdf editor linux,Foxit PDF Editor
- 银行卡卡号识别(照片)python
- vscode 修改注释颜色
- 隆马斯克最喜欢的面试问题 【翻译】
- vue3 setup vetur报错 解决方案 vscode
- 【食品加工技术】第二章 果蔬加工技术 笔记
- java: 错误: 找不到符号
- 知识点2:js(javascript)中检测是否为数组的两种方法【翻转数组案例】
- 平安保险公司软件测试机试题
- 服务器被大流量攻击该怎么办
- 基于STM32F103RCT6实现串口中断发送,使用环形队列