Net高级技术——IDisposable.doc_第1页
Net高级技术——IDisposable.doc_第2页
Net高级技术——IDisposable.doc_第3页
Net高级技术——IDisposable.doc_第4页
Net高级技术——IDisposable.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Net高级技术IDisposableIDisposable概述GC(垃圾收集器)只能回收托管(Managed)内存资源,对于数据库连接、文件句柄、Socket连接等这些资源(非托管资源,UnManaged)就无能为例,必须程序员自己控制资源的回收。非托管资源:SqlConnection、FileStream等。对于使用非内存资源的类,完全可以自己定义一个销毁资源的方法来供程序员回收,.net推荐实现IDisposable接口(为了规范非托管资源的回收),在Dispose方法中进行回收。实现了IDisposable接口的对象都可以使用using进行资源管理。using就是帮我们做了:复制代码1 FileStream fs = new F.2 try 3 fs.read().4 5 finally 6 fs.Dispose();7 复制代码实现了IDisposable接口的对象都要进行回收,否则很可能有内存泄露。非托管内存资源才需要实现IDisposableIDisposable例子复制代码 1 namespace 资源回收 2 3 class Program 4 5 static void Main(string args) 6 7 /使用using对实现IDisposable的类了进行资源管理 8 /*拿到一个对象的时候,首先判断这个对象是否实现了IDisposable接口,如果实现了,最好就用using包裹住这个对象,保证这个对象用完之后被释放掉,否则很可能出现资源泄露的问题 9 */10 using (Telphone t1 = new Telphone()11 12 t1.Open();13 t1.Speak(hello);14 t1.Bomb();15 /t1.Dispose();/如果在这里调用了Dispose()方法释放资源,那么在执行t1.Open()方法就出错,电话线已经被剪断了,无法再打电话了16 t1.Open();17 t1.Speak(I am back!);18 /代码执行到这里后,就会调用Dispose方法来进行资源回收19 Console.ReadKey();20 21 22 / 23 / Telphone类实现了IDisposable接口24 / 25 class Telphone : IDisposable26 27 / 28 / 电话状态29 / 30 private TelphoneState state;31 / 32 / 打电话33 / 34 public void Open()35 36 if (state = TelphoneState.Disposed)37 38 throw new Exception(电话线已经被剪断,无法打开!);39 40 state = TelphoneState.Open;41 Console.WriteLine(拿起电话);42 43 / 44 / 说话45 / 46 / 说话内容47 public void Speak(string s)48 49 if (state != TelphoneState.Open)50 51 throw new Exception(没有连接);52 53 Console.WriteLine(s);54 55 / 56 / 挂掉电话57 / 58 public void Bomb()59 60 state = TelphoneState.Close;61 Console.WriteLine(挂掉电话);62 63 #region IDisposable 成员64 / 65 / 实现IDisposable接口中的Dispose()方法来释放非托管资源66 / 如何释放非托管资源由程序自己定67 / 68 public void Dispose()69 70 if (state = TelphoneState.Open)71 72 Bomb();/挂掉电话73 74 state = TelphoneState.Disposed;75 Console.WriteLine(剪断电话线);76 77 #endregion78 79 / 80 / 电话状态枚举81 / 82 enum TelphoneState83 84 Open, Close, Disposed85 86 .Net高级技术结构体结构体结构体和类的区别:结构体是值类型,类是引用类型结构体非常类似于类,但是值类型(拷贝传递),不能被继承Int32、DateTime等都是结构体,从ValueType继承,值类型。结构体测试程序:复制代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Drawing; 6 namespace 结构体 7 8 class Program 9 10 static void Main(string args)11 12 Person p1 = new Person();13 Person p2 = p1;14 p1.Age = 24;15 p1.Name = 孤傲苍狼;16 Console.WriteLine(p1.Name=0,p1.Age=1, p1.Name, p1.Age);17 Console.WriteLine(p2.Name=0,p2.Age=1, p2.Name, p2.Age);18 p2.Name = 白虎神皇;19 Console.WriteLine(p1.Name=0,p1.Age=1, p1.Name, p1.Age);20 Console.WriteLine(p2.Name=0,p2.Age=1, p2.Name, p2.Age);21 Console.WriteLine(object.ReferenceEquals(p1, p2);22 Console.WriteLine(object.Equals(p1,p2);23 Console.WriteLine (.(p1 = p2);24 MyPoint point1 = ReadKey new MyPoint();25 MyPoint point2 = point1;26 Console.WriteLine(object.ReferenceEquals(point1, point2);/结构体是值类型,拷贝一份,因此point1和point2是两个不同的对象27 point1.X = 10;28 point1.Y = 20;29 point1.SayHello();30 Console.WriteLine(point1.X=0,point1.Y=1, point1.X, point1.Y);31 Console.WriteLine(point2.X=0,point2.Y=1, point2.X, point2.Y);32 Console.ReadKey();33 34 35 /结构体非常类似于类,但是值类型(拷贝传递),不能被继承36 /Int32、DateTime等都是结构体,从ValueType继承,值类型。37 / 38 / 定义结构体39 / 40 struct MyPoint41 42 / 43 / 定义结构体的属性44 / 45 public int X get; set; 46 / 47 / 定义结构体的属性48 / 49 public int Y get; set; 50 / 51 / 定义结构体的方法52 / 53 public void SayHello()54 55 Console.WriteLine(HelloWorld!);56 57 58 / 59 / 定义类60 / 61 class Person62 63 public int Age get; set; 64 public string Name get; set; 65 66 Stopwatch的使用复制代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Stopwatch的使用 8 9 class Program10 11 12 / 13 / 使用Stopwatch比较for循环和foreach循环的效率14 / 15 / 16 static void Main(string args)17 18 19 int intArr = new int1000000;20 for (int i = 1; i = 1000000; i+)21 22 intArri - 1 = i;23 24 25 /使用Stopwatch统计程序运行的时间26 /*27 Stopwatch提供了几个方法用以控制Stopwatch对象。28 * Start方法开始一个计时操作,Stop方法停止计时。29 * 此时如果第二次使用 Start方法,将继续计时,最终的计时结果为两次计时的累加。30 * 为避免这种情况,在第二次计时前用Reset方法将对象归零。这三个方法都不需要参数31 */32 System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 33 sw.Start(); /开始计时34 35 int sum = 0;36 37 for (int i = 1; i = intArr.Length; i+)38 39 sum += i;40 41 Console.WriteLine(sum=0,sum);42 43 sw.Stop(); /停止计时44 long result = sw.ElapsedMilliseconds;/获得程序运行的时间45 Console.WriteLine(使用for循环计算从1加到1000000的和所需要的时间是:0, result);46 47 Console.WriteLine(*);48 sw.Reset();49 sw.Start()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论