Tag: 析构函数

在部署时将类保存到磁盘:我的代码是否有错误?

我正在尝试创建一个简单的类,当它不再使用时将其自身序列化为磁盘。 我现在的代码(见下文)。 我现在的代码似乎工作,但我对我的知识并不完全自信,所以我想知道是否有其他人看到这个代码有任何重大问题。 void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } ~MyClass() { Dispose(false); } protected virtual void Dispose(bool disposing) { if (!this.disposed) { MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, this); byte[] output = Dostuff(ms); File.WriteAllBytes(DBPATH, output); } this.disposed = true; }

为什么垃圾收集器以错误的顺序获取对象?

我有一个带有两个类A和B的应用程序。类A在类B的引用内部。类的析构函数执行一些资源清理,但它们必须按正确的顺序调用,首先是A的析构函数和那么B的析构函数 发生的事情是,以某种方式首先调用B的析构函数,然后A的析构函数崩溃,因为它试图从已处置的对象执行方法。 GC的这种行为是否正确? 我希望GC检测到A有对B的引用,然后先调用A析构函数。 我对吗? 谢谢你的队友! PD:如果对析破器/终结器/处理器等有疑问,那就是我们所拥有的: ~A() { this.Dispose(); } ~B() { this.Dispose(); }

是不是保证完成运行的析构函数?

析构函数很奇怪 。 我试图通过使用“智能”参考管理来消除使用一次性模式的需要,确保垃圾收集器可以在正确的时间收集对象。 在我的一个析构函数中,我不得不等待来自另一个对象的事件,我注意到它没有。 应用程序只是关闭,析构函数在执行过程中终止。 我希望总是允许析构函数完成运行,但是下面的测试表明这不是真的。 using System; using System.Diagnostics; using System.Threading; namespace DestructorTest { class Program { static void Main( string[] args ) { new DestructorTest(); new LoopDestructorTest(); using ( new DisposableTest() ) { } } } class DestructorTest { ~DestructorTest() { // This isn’t allowed to finish. Thread.Sleep( 10000 ); } } class […]

GC.Collect()不立即收集?

在聊天的讨论过程中,我编写了这个控制台应用程序。 码: using System; class Program { static void Main(string[] args) { CreateClass(); Console.Write(“Collecting… “); GC.Collect(); Console.WriteLine(“Done”); } static void CreateClass() { SomeClass c = new SomeClass(); } } class SomeClass { ~SomeClass() { throw new Exception(); } } 结果: Collecting… Done Unhandled Exception: System.Exception: Exception of type ‘System.Exception’ was thrown. at SomeClass.Finalize() 在 Done打印之前,我原本预计应用程序会崩溃。 […]

手动销毁C#对象

我对学习C#(来自Java和C ++背景)相当新,我有一个关于手动垃圾处理的问题:是否有可能手动销毁C#中的对象? 我知道IDisposable接口,但是假设我正在处理一个我没写过的类而且它没有实现它? 它不会有.Dispose()方法,因此using { }是out,而且.Finalize总是protected或private因此也不是一个选项。 (我只是想在这种情况下学习C#中可能的内容 。我想如果所有其他方法都失败了,我可以inheritance假设的ImNotDisposable类,以便它实现IDisposable。)