`

C#精髓【月儿原创】第一讲 使用垃圾回收器

阅读更多

说明:准备出一个系列,所谓精髓讲C#语言要点。这个系列没有先后顺序,不过尽量做到精。可能会不断增删整理,本系列最原始出处是csdn博客,谢谢关注。

C#精髓

第一讲 使用垃圾回收器

作者:清清月儿

主页:http://blog.csdn.net/21aspnet/    时间:2007.3.22

内存有限,所以必须在不被占有的时候回收。

方法结束时值类型容易销毁。引用类型就不同。

析构函数~+类名;垃圾回收时执行任何整理。可以在任何线程上执行。

析构函数的限制:
1.不能在struct上声明;
2.不能有访问修饰符例如public;
3.不能带参数也不能接受参数,所以不可被重载,所以一个类最多一个析构函数;
4.析构函数是被自动调用,不可显示调用,不可被继承。
5.析构函数声明的标识符必须是类名;
6.析构函数声明包括extern修饰符时称外部析构函数,不提供任何实际的实现,函数体由一个分号组成。
7.非外部析构函数都都包含一个块。

任何代码不再使用某实例时,该实例就符合销毁条件。
销毁实例按照从派生程度最大到最小的顺序,调用继承链中的各个析构函数。

析构函数实际是重写了System.Object中的虚方法Finalize.

C#中永远不能亲自摧毁对象

垃圾回收器的保证:
每个对象都被摧毁;
每个对象都只被摧毁一次;
每个对象只有在该对象不存在任何引用才会摧毁;
目的:让程序员告别麻烦又易出错的清理工作。

可以调用静态方法System.GC.Collect()垃圾回收器;
但不建议这么做;

只有对象垃圾回收时才运行析构函数。含有析构函数的类会使代码和回收过程复杂影响性能。

更好的方法:
disposal方式--亲自释放
TextReader reader =new StreamReader(filename)
try{
string line;
while((line=reader.ReadLine())!=null)
{Console.Write(line);
}
finally{
reader.Close();
}

但这样做并不完美:
1.dispose多个资源会变得难以控制。
2.有时要修改代码(finally块中的引用不能为null)
3.不能创建解决方案的一个抽象,这意味方案难以理解,而你必须在需要该功能的任何地方重复代码。
4.对资源的引用保留在finally块之后的作用域中,这意味着可能不小心试图使用一个已经释放的资源。

using就是为解决这些而设计的;
可以将using语句作为一种明确异常安全的可靠的方式来保证一个资源总是被自动释放。这解决了人工try/finally中存在的问题。
需要dispose多个资源时有良好的扩展性;
不影响程序代码的逻辑;
对问题进行良好的抽象,避免重复性代码;
非常可靠;

注意此using非引入命名空间的using.
此using语法是
using(type variable=initialization) embeddedStstement

确保DataReader绝对Close
using(SqlDataReader dr=...)
     {
      if(dr.HasRows)
      {
       while(dr.Read())
       {...}
     }
   }

using语句获取一个或多个资源,执行一个语句,然后处理这些资源。资源是实现IDisposable接口的类或结构。
正在使用资源的代码可以调用Dispose释放,如果不调用会由垃圾回收器处理。
using语句声明的局部变量【只读,不可ref out】,表达式必须是实现了IDisposable接口或可以隐式转化为IDisposable的一个类型。

using语句:获取-使用-处置

从析构函数中调用Dispose方法也许能保证它总是运行。
class Example:IDisposable
~example(){
Dispose();
}
public virtual void Dispose();
{
if(!this.disposed){
try{
//在此释放稀缺资源
}
finally{
this.disposed=true;
GC.SuppressFinalize(this);
}
}
}
public void SomeBehavior()//示例方法
{
checkifdisposed();
}
...
private void checkifdisposed(){
if(this.disposed)
{
throw new ObjectDisposedException("Example");
}
}
private Resource scarce;
private bool disposed=false;
}
注意
1.类实现了IDisposable
2.析构函数调用Dispose
3.Dispose方法是public可以随意调用
4.Dispose方法可以安全的多次调用。变量disposed指出方法以前是否运行过,只有第一次运行才会释放稀缺资源
5.Dispose方法调用静态的GC.SuppressFinalize方法。该方法防止垃圾回收器在这个对象上调用析构函数,因为对象现在已经finalized
6.类的所有常规方法都要检查对象是否disposed如果是就抛出异常
 

 

分享到:
评论

相关推荐

    C#精髓【月儿原创】第四讲 GridView 72般绝技

    【C#精髓——GridView 72般绝技详解】 在ASP.NET开发中,GridView控件是一种常用的数据展示组件,能够方便地对数据进行各种操作,如分页、排序、编辑、删除等。本文将深入探讨GridView的多个核心功能,帮助开发者...

    java C#垃圾回收算法分析

    Java和C#是两种流行的面向对象的编程语言,它们都具备自动内存管理机制,其中垃圾回收(Garbage Collection, GC)是一项核心功能。垃圾回收旨在自动检测并释放不再使用的内存,防止内存泄漏,确保程序的稳定运行。...

    c#垃圾回收资源.net回收机制

    .NET 垃圾回收机制支持三代对象:第一代对象是最近创建的对象,第二代对象是经历过一次垃圾回收的对象,第三代对象是经历过两次以上的垃圾回收的对象。 在 .NET 中,垃圾回收机制可以分为两个阶段:标志阶段和紧缩...

    C#精髓.PDF

    本书《C#精髓》涵盖了C#语言的核心概念,包括其语法、面向对象的特性、类型系统、异常处理、垃圾回收机制以及C# 2001年的最新特性。书中可能详细介绍了以下几个方面: 1. C#语言的基础知识:包括变量、数据类型、...

    c#的GC垃圾回收机制详细讲解文档

    C#的垃圾回收机制(GC)是.NET框架中一个至关重要的特性,它负责自动管理和释放内存,从而减轻程序员的工作负担。GC的主要目标是回收不再使用的对象所占用的内存,以防止内存泄漏。在这个机制下,程序员无需手动管理...

    C#中的垃圾回收机制

    1. C#中的垃圾回收机制可以自动管理内存。 2. 托管资源是指由.NET Framework管理的资源。 3. 非托管资源是指由操作系统管理的资源。 4. 实现IDisposable接口可以帮助开发者释放非托管资源。 5. Dispose方法用于释放...

    Java与C#的垃圾回收机制

    本文将深入对比Java与C#这两种广泛使用的编程语言中的垃圾回收机制,帮助开发者更好地理解它们的工作原理以及差异。 #### 二、Java的垃圾回收机制 ##### 2.1 Java内存区域 Java虚拟机(JVM)将内存划分为几个主要...

    C#精髓 核心版pdf

    C#精髓电子书,pdf高清版,刘基诚译本,C#精髓简明扼要地介绍 C#(读如C Sharp)语言和.NET 框架,使读者能够尽快掌握这项最新的开发技术。但对初学者而言有一定的难度,如果你已经熟悉C++,Smalltalk,Java 或...

    C#精髓中文版

    C#精髓中文版 前言 第一章 简介 c#语言 clr bcl 第一个c#程序  第二章 c并语言参考 标识符 类型 变量 表达式与运算符 语句 类型组织 继承 访问修饰字 类和结构 接口 数组 枚举 委托...

    垃圾回收技术示例 垃圾回收技术示例

    垃圾回收(Garbage Collection, GC)是编程语言中用于自动管理内存的重要机制,尤其是在像Java、C#等语言中。这个技术示例旨在深入探讨垃圾回收的原理、工作流程以及在实际开发中的应用。 垃圾回收的基本目标是识别...

    C#精髓——经典著作

    本书《C#精髓》将全面覆盖以上知识,并可能深入讨论C#的高级特性,如反射、委托、事件、泛型、元数据以及垃圾回收机制等。通过学习这本书,读者不仅可以掌握C#编程的基础,还能了解到C#在实际项目中的最佳实践,提升...

    C#精髓(深入学习C#必备)

    如果你想更进一步的,系统的学习C#,那么本书一定对你有所帮助!

    c#垃圾回收总结.ppt

    c#垃圾回收总结.ppt

    C#中实现内存回收

    总之,C#中的垃圾回收是一个自动过程,但开发者可以通过理解其原理和适时使用`GC.Collect()`来优化内存管理。`MemoryCollectTest`程序是一个很好的学习工具,它可以帮助我们更好地掌握内存管理技巧,防止内存泄露,...

    灵巧指针与垃圾回收(Java、C#、C++)

    【灵巧指针与垃圾回收】是编程语言中关于内存管理的一个重要概念,尤其是在Java、C#和C++之间有着显著的区别。Java和C#都内置了垃圾回收机制,允许程序员在分配内存后无需手动释放,由系统自动进行垃圾回收。这种...

    C#中的指针和内存管理以及垃圾回收PPT

    ### C#中的指针、内存管理及垃圾回收详解 #### 指针(Pointer) 在C#编程语言中,虽然直接操作指针的情况较为少见,但确实存在某些应用场景下需要使用到指针。C#设计初衷是为了提供一种更加安全且易于管理内存的方法...

    .NETFramework垃圾回收3.5Version.pdf

    - 弱引用允许程序保持对对象的引用,但不会阻止垃圾回收器回收该对象。这意味着,即使有弱引用指向对象,当对象不再被其他强引用引用时,垃圾回收器仍可回收它。 3. **被动回收(Passive Collection)**: - 被动...

    C# 内存回收方法

    C# 内存回收C# 内存回收C# 内存回收C# 内存回收C# 内存回收

    C#精髓(PDF文件格式)

    《C#精髓》是一本深度剖析C#编程语言和.NET框架的专业书籍,旨在帮助开发者全面理解和熟练运用C#进行软件开发。C#是微软公司推出的一种面向对象的、现代的编程语言,它在Windows平台上的应用程序开发,尤其是游戏...

Global site tag (gtag.js) - Google Analytics