Tag: dispose

C#如何实现Dispose方法

我需要一些关于Dispose方法实现的建议。 在我们的应用程序中,用户设计自己的UI。 我有一个预览窗口,显示UI的外观。 在此UI中绘制的所有对象最终都来自公共基类ScreenObject。 我的预览管理器包含对ScreenGrid的单个对象引用,ScreenGrid是整个预览区域的网格对象。 问题#1 我的一些派生屏幕类保留在非托管资源上,例如数据库连接,位图图像和WebBrowser控件。 这些类需要处理这些对象。 我在基本ScreenObject基类中创建了一个虚拟Dispose方法,然后在每个保存非托管资源的派生类中实现了一个覆盖Dispose方法。 但是,现在我刚刚创建了一个名为Dispose的方法,我没有实现IDisposable 。 我应该实现IDisposable吗? 如果是这样,我该如何实现它? 仅在具有非托管资源的派生类上 具有非托管资源的基类和派生类 基类和所有派生类,包括那些没有非托管资源的类 将虚拟Dispose方法放在没有非托管资源的基类中是否错误,以便您可以利用多态? 问题2 在阅读Dispose方法和IDisposable接口时,Microsoft声明处置对象应该只为其父级调用Dispose方法。 父母将为其父母调用它,依此类推。 对我而言,这似乎是倒退。 我可能想要处理一个孩子但保留其父母。 我认为它应该是另一种方式,处置的对象应该处理它的孩子。 然后孩子们应该处理他们的孩子等等。 我在这里错了还是我错过了什么?

自闭式StreamWriter单例

我试图在其生命周期结束时进一步缩小Flush StreamWriter中的问题,实现类似单例的自关闭StreamWriter : class Foo : System.IO.StreamWriter { private static readonly Foo instance = new Foo( “D:/tmp/test” ); private Foo( string path ) : base( path ) { } ~Foo() { this.Close(); } public static Foo Instance { get { return instance; } } } 预期的效果是在像这样的示例程序中 class Program { private static void Main( string[] args […]

处理用户控件,真的是要编辑.designer.cs文件吗?

对于具有必须处理的内部数据结构的用户控件,是将该代码添加到.designer.cs文件中的Dispose方法的正确位置,还是存在我们打算使用的事件? 编辑 :这是一个winforms用户控件。

处理嵌套的一次性物品?

我想知道是否有关于处理嵌套在另一个一次性物品内的一次性物品的约定(在财产/公共领域,而不是私人成员)。 例如,DataSet包含DataTable,SqlCommand包含SqlConnection。 显而易见的是,一个class级处理它拥有的所有Disposable物品,剩下的就是其余部分。 是否存在这样的惯例? 如果是这样,.NET库如何确定谁拥有什么? 如何确定是否正在处理嵌套对象? PS:我一直想知道这个问题,显然有其他问题: 调用SqlCommand.Dispose时会出现什么问题? 编辑1:发现配置DataSet,不配置其表。 // Fill dataset from sqldataadpater. foreach (DataTable dt in dataSet.Tables) { dt.Disposed += Program.DisposedEventHandler2; } Console.WriteLine(“Disposing dataset”); dataSet.Dispose(); //Event not fired here. Console.WriteLine(“Disposing datatables maually”); foreach (DataTable dt in dataSet.Tables) { dt.Dispose(); //Event fired here } #endregion

如果您已经关闭了SqlConnection,是否需要关闭/处理SqlDataReader?

我注意到了这个问题 ,但我的问题更加具体。 使用有什么好处 using (SqlConnection conn = new SqlConnection(conStr)) { using (SqlCommand command = new SqlCommand()) { // dostuff } } 代替 using (SqlConnection conn = new SqlConnection(conStr)) { SqlCommand command = new SqlCommand(); // dostuff } 显然,如果您计划使用相同的连接运行多个命令,这很重要,因为关闭SqlDataReader比关闭并重新打开连接更有效(调用conn.Close();conn.Open();也将释放连接)。 我看到许多人坚持认为无法关闭SqlDataReader意味着保留开放的连接资源,但这不仅适用于您不关闭连接吗?

返回USING创建的对象

我正在创建一个对象(下面的obj)使用并返回该对象作为函数return的一部分。这会导致在我尝试在另一个函数中使用返回值之前处理像object这样的任何问题吗? using (MyObject obj = new MyObject()) { . . . return obj; }

什么时候需要dispose()的规则是什么?

虽然我已经编写了一段时间,但我真的只是进入了我所谓的中级编码器。 所以我理解dispose()的原理,即释放为变量和/或资源保留的内存。 我也发现有时使用EF我必须dispose()以便其他操作正常工作。 我不明白的只是需要发布的内容,何时使用dispose()。 例如,我们不处理像字符串,整数或布尔值这样的变量。 但是在某个地方我们越过“一条线”,我们使用的变量和/或资源需要被处理掉。 我不明白这条线在哪里。 在知道何时使用dispose()时,是否有一个原则或几个广泛的原则适用? 我读了这些SOpost( 具体情况 , 更多关于如何而不是何时 )但我不觉得我理解何时使用dispose()的基础知识。 我看到一条评论询问当变量超出范围时是否释放内存,这引起了我的注意,因为直到我看到响应为否,它才会因为超出范围而被释放,我会想到当它超出范围时它会被释放。 我不想成为第二个链接中的一个人称为“无能的开发者”,虽然我认为这有点苛刻。 我们中的一些人还在学习。 所以这就是为什么我的问题是“什么时候确定需要处置?”? 我的问题不再那么多, 何时 。 当然评论如何有用,但即使调用dispose()的方法是一个Using语句,我仍然需要知道何时。 编辑原始问题:我知道这是一个很长的解释, 标记为重复的评论笔记请求,这不是一个咆哮,我只是不知道如何确保我把焦点放在我的精确问题上。 很多时候,我们只是匆匆走过我们问的方式。 正如我在这篇长篇文章的最后提到的那样,在我们专注于我的问题之后,我将编辑所有这些,假设我们到达那里。 根据我所读到的内容,我认为这是一个重要的问题。 提议的“答案”post是一篇很棒的post,但并没有真正回答我的问题。 CodeNotFound下面的评论也提供了一个很好的链接,但它也没有真正回答我的问题。 我提供了有关这些post的评论,试图帮助完善我的确切问题: 我什么时候应该在.NET中处理我的对象? :第一个答案以评论开头 一次性对象表示持有CLR本质上不知道的有价值资源的对象。 不幸的是,我不明白“ 一次性对象…… CLR本质上没有意识到 ”这一术语包括在内。 这就是我的要求。 我怎么知道某件事是否属于我必须处理的范畴? 我们一直在代码中定义要使用的东西。 我们什么时候越线,它成为我需要处置的对象()? 顺便说一句,我注意到那篇文章的作者从未标出答案。 我不知道这是否意味着他不觉得这个问题得到了回答,或者他的跟进是否很差,但我希望我能够提炼一点我希望了解的内容。 当你仔细研究答案时,他们并没有真正解决哪些对象需要开发人员处理它们的问题,或者我如何知道如何识别哪些对象。 我只是不知道我创建的对象或事物需要我负责处理。 而且我认为GC和其他条款发挥作用,但同样,这就是如何 。 显而易见的是,大多数经验丰富的专业开发人员都知道他们创建的东西何时需要被处理掉。 我不明白怎么知道。 正确使用IDisposable界面 :显然是一个流行的答案(1681 upvotes),但明确的答案开始于 Dispose的目的是释放非托管资源“。 好的,但我的问题是如何通过查看它是非托管资源的东西来了解? 我不明白下面的注释如何适用于需要处理的内容。 如果你在.NET框架中找到它,那么它就是托管的 […]

C#处理IDisposable

有人可以解释如果你不Dispose一些IDisposable实体(通过using或直接Dispose调用)可能会发生什么? 这是否总是导致内存泄漏?如果是, C#内存泄漏类似于C++内存泄漏,它们很容易导致崩溃,或者从这个角度看C#沙箱是否更安全? 谢谢。

在SendComplete中配置SmtpClient?

当我使用SmtpClient的SendAsync发送电子邮件时,如何正确配置smtpclient实例? 让我们说: MailMessage mail = new System.Net.Mail.MailMessage() { Body = MailBody.ToString(), IsBodyHtml = true, From = new MailAddress(FromEmail, FromEmailTitle), Subject = MailSubject }; mail.To.Add(new MailAddress(i.Email, “”)); SmtpClient sc = new SmtpClient(SmtpServerAddress); //Add SendAsyncCallback to SendCompleted sc.SendCompleted += new SendCompletedEventHandler(SendAsyncCallback); //using SmtpClient to make async send (Should I pass sc or mail into SendAsyncCallback?) sc.SendAsync(mail, sc); […]

这个IDisposable实现是否正确?

我永远不会记住实现IDisposable接口的所有规则,因此我尝试提出一个基类来处理所有这些并使IDisposable易于实现。 我只是想听听你的意见,如果这个实现是好的,或者你是否看到我可以改进的东西。 该基类的用户应该从它派生,然后实现两个抽象方法ReleaseManagedResources()和ReleaseUnmanagedResources() 。 所以这是代码: public abstract class Disposable : IDisposable { private bool _isDisposed; private readonly object _disposeLock = new object(); /// /// called by users of this class to free managed and unmanaged resources /// public void Dispose() { DisposeManagedAndUnmanagedResources(); } /// /// finalizer is called by garbage collector to free unmanaged resources […]