Pho*_*non 1 .net c# vb.net constructor memory-management
来自C++等更低级的语言,看看.NET内存管理是多么透明,我有一个关于我编写的一行代码的音乐会.
在C++中,每个对象必然(指定设计实践和内存管理的特性)需要有构造函数和析构函数.在.NET中,不需要经常使用析构函数,并且在需要它们以及如何使用它们时有不同的模式.我的问题是这个.如果我有类似的代码(在VB.NET中,但同样适用于C#)
Dim myObj As New MyClass( <some parameters here> )
Run Code Online (Sandbox Code Playgroud)
之后是代码中的以下行
myObj = New MyClass( <some other parameters> )
Run Code Online (Sandbox Code Playgroud)
以上会导致内存泄漏吗?思考这种情况的正确方法是什么?
不,这不会导致内存泄漏.你写的代码很好.关于C#(以及其他.NET语言)你必须要记住的是它们是垃圾收集的.
与C++不同,您自己明确负责创建和释放内存,但在.NET的托管环境中并非如此.所有你不必担心的是创建对象.当不再有任何剩余引用时,它就有资格进行垃圾回收.说真的,我知道这听起来很奇怪,考虑到你在其他语言的背景,但你真的应该让垃圾收集者担心这些事情."正确思考这种情况的方式"确实根本不考虑它们!
实际上,您需要编写析构函数(因此担心内存管理)的唯一时间是您的类使用非托管对象(例如窗口句柄,GDI +对象等)或其他需要显式关闭的对象(文件句柄,数据库连接等).在.NET世界中,您希望尽可能少地编写析构函数,因为这样做会有轻微的性能损失.具体在于垃圾收集算法的实现,以及在什么时候可以收集对象,但你不应该尝试学习所有这些.
要记住的重要一点是,如果你确实需要在对象被销毁时"清理",你应该实现IDisposable接口,就像许多WinForms类(例如Control)那样在内部使用非托管对象.
以下是了解.NET的垃圾收集模型的一些很好的资源: