当前位置:首页 > Windows程序 > 正文

C# 基础才是重中之重~对象的生与死

2021-03-19 Windows程序

标签:

为何要写

之所以写这篇文章,完全是因为学生们在实际开发中遇到的问题,一个对象占用的内存空间总不被释放,导致系统内存不断攀升,其最主要原因是我们对“对象的生与死”不清楚,或者从来没有认真去考虑过这件事,确实一个对象在被声音,初始化,使用或者最后被系统回收,整个的过程与我们关系确实不大,我们开发人员直接用就行了,对于C#这种托管语言你没必要去自己回收它,但有时,我们多了解一点系统的回收机制,对我们的程序还是很有好处的。

对象的种类(根据作用域)

1 类对象,静态对象,使用static修饰符进行声明,作用域为整个类(所有实体公有),当你的程序运行期间它一直不会被回收,直到你的进程结束(所以使用它要注册,大数据一般不用类对象存储)

2 类级别的实例对象,它定义在类里,方法体外面,作用域为整个类的当前实例,它的回收时机我们无法确定,当然你可以手动进行  GC.Collect()来马上释放它,否则由系统的垃圾回收机制管理它

3 方法级别的实例对象,局部对象,它定义在方法内部,作用域为当前方法体,方法执行完成后,自动释放

代码中的实验

public class Product { ~Product() { Logger.LoggerFactory.Instance.Logger_Info("Product对象已经被释放"); } public int ID { get; set; } public string Name { get; set; } } public class ProductConfig { ~ProductConfig() { Logger.LoggerFactory.Instance.Logger_Info("ProductConfig对象已经被释放"); } public int ID { get; set; } public string Name { get; set; } }

/// <summary> /// 类级别的 /// </summary> ProductConfig productConfig = new ProductConfig(); public ActionResult Create() { /// <summary> /// 实例成员,方法体里 /// </summary> Product product = new Product(); GC.Collect();//清除全局实例成员,否则全局实例对象将不会马上清楚,它会等待垃圾回收 return View(); }

上面代码在执行后,会写入日志文件,由于在方法里使用了GC.Collect()方法,这时全局实例对象ProductConfig将会在方法执行后被释放,如果不加这个方法,那么ProductConfig何时释放,我们是不知道的。

技术分享

Dispose模式

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/63617.html