我需要一些关于该Dispose方法实现的建议.
在我们的应用程序中,用户设计自己的UI.我有一个预览窗口,显示UI的外观.此UI中绘制的所有对象最终都来自公共基类ScreenObject.我的预览管理器包含对ScreenGrid的单个对象引用,ScreenGrid是整个预览区域的网格对象.
问题#1
我的一些派生屏幕类保留了非托管资源,例如数据库连接,位图图像和WebBrowser控件.这些类需要处理这些对象.我在基类中创建了一个虚Dispose方法,ScreenObject然后Dispose在每个派生类中实现了一个覆盖非托管资源的覆盖方法.但是,现在我刚刚创建了一个名为的方法Dispose,我没有实现IDisposable.我应该实施IDisposable吗?如果是这样,我该如何实现它?
将虚Dispose方法放在没有非托管资源的基类中是否错误,以便您可以利用多态?
问题2
在阅读有关Dispose方法和IDisposable接口的过程中,Microsoft声明处置对象应该只调用Dispose其父对象的方法.父母将为其父母调用它,依此类推.对我而言,这似乎是倒退.我可能想要处理一个孩子但保留其父母.
我认为它应该是另一种方式,处置的对象应该处理它的孩子.然后孩子们应该处理他们的孩子等等.
我错在这里还是我错过了什么?
我最近遇到过Dispose方法必须在C#程序中进行硬编码的情况.否则,电子邮件中使用的文件将"永久"锁定,甚至进程管理器也无法告诉我锁定它的人/锁定了什么.我不得不使用Unlocker Assistant强制删除文件,但我担心现在我在服务器上留下了一些已分配的内存块.
我指的代码是这样的:
MailMessage mail = new MailMessage();
mail.From = new MailAddress("reception@domain.com", "###");
mail.Subject = "Workplace Feedback Form";
Attachment file = new Attachment(uniqueFileName);
mail.Attachments.Add(file);
mail.IsBodyHtml = true;
mail.CC.Add("somebody@domain.com");
mail.Body = "Please open the attached Workplace Feedback form....";
//send it
SendMail(mail, fldEmail.ToString());
Run Code Online (Sandbox Code Playgroud)
上面的代码使文件不uniqueFileName被Attachment句柄锁定,我无法删除它,因为这段代码是从客户端机器(而不是从服务器本身)运行的,所以无法找到该文件的句柄.
在我强制删除文件之后,我从另一个论坛发现我应该有Disposed of Attachment对象.
所以我在发送电子邮件后添加了这些代码行...
//dispose of the attachment handle to the file for emailing,
//otherwise it won't allow the next line to work.
file.Dispose();
mail.Dispose(); //dispose of the email object itself, but …Run Code Online (Sandbox Code Playgroud)