Tag: dispose

什么时候处置?为什么?

我问了一个关于这个方法的问题 : // Save an object out to the disk public static void SerializeObject(this T toSerialize, String filename) { XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType()); TextWriter textWriter = new StreamWriter(filename); xmlSerializer.Serialize(textWriter, toSerialize); textWriter.Close(); } 在回复中,我将此作为补充评论: 确保始终处理一次性资源,例如流和文本阅读器和编写器。 在您的SerializeObject方法中似乎不是这种情况。 所以,我可以说,对于那些编写C#一年或两年的人来说,这似乎是非常蹩脚的,但为什么我必须处理它呢? 是看到testWriter有一个dispose方法,但是不应该把垃圾收集照顾testWriter吗? 我从Delphi来到C#。 在Delphi中我不得不清理所有东西,所以这不是我想要变懒的情况。 我刚刚被告知,如果你强行释放你的对象占用的内存,那么它可能会导致坏事。 有人告诉我“让垃圾收集器去做”。 那么,为什么我需要调用dispose? (我的猜测是因为textWriter击中了磁盘。) 是否有我需要注意的对象列表? (或者知道何时需要调用dispose的简单方法?)

拥有一次性田地的类型应该是一次性的。 怎么解决这个警告?

我尝试在VisualStudio 2012使用“运行代码分析”选项,因此我收到了警告 CA1001 Types that own disposable fields should be disposable Implement IDisposable on ‘DBConnectivity’ because it creates members of the following IDisposable types: ‘SqlConnection’, ‘SqlCommand’. 我在SO中提到了一些问题,但是我无法IDisposable和以下是该类,负责此警告。 class DBConnectivity { public SqlConnection connection = null; public SqlCommand command = null; public SqlDataReader dataReader = null; public string connectionString = null; public List masterTableList; public DBConnectivity() […]

了解Streams及其生命周期(Flush,Dispose,Close)

注意:我已经阅读了以下两个问题: 你能解释一下溪流的概念吗? C#使用流 我在C#中编码 在几乎所有使用流的代码示例中,几乎总是调用.Dispose(),.Flush(),.Close()。 在流的概念中,完成了什么? 如果我不处理存储在变量中的流,我的应用程序是否泄漏到某处? 为什么我需要调用这些函数中的任何一个? 我见过没有这样做的代码示例仍然可以完成工作(没有明显的破损) 我正在我的应用程序中构建一个类,它包含一个主方法(让我们称之为GetStream() ),它通过myWebRequest.GetResponse().GetResponseStream()返回一个流myWebRequest.GetResponse().GetResponseStream() 主要方法GetStream()返回一个Stream对象,该对象可用于需要流的任何操作(StreamReader,Bitmap()等)。 有没有办法让流在最后一次使用后自动处理(垃圾收集?),而不强迫任何人调用.GetStream()来手动处理它? 你可能会说,我的问题很模糊和笼统。 我对流的理解并不牢固,所以任何链接到有用的文章,提供更深入的视图流,而不是SO问题可以提供。

我们什么时候需要在dot net c#中调用Dispose()?

创建后我是否需要处理sqldatareader? SqlDataReader reader; — — — reader.Close(); reader.Dispose();

MVC 3 – ObjectContext实例已被释放,不能再用于需要连接的操作

我对C#和MVC很新,我一直在创建自己的小博客网站作为测试项目。 虽然大多数事情都在发挥作用,但我在从LINQ查询中选择多个列时遇到了问题。 只有在关于SO的问题上遇到磕磕绊绊之后,才意识到我可以使用生成的实体类作为强类型模型来处理这个问题。 我需要这个,因为我一直在创建一个数据库层(这也是我之前没有用过的东西)并试图通过该层传递匿名类型不起作用。 我理解为什么会这样,所以我很满意我正朝着正确的方向前进。 然而,这种方法似乎给了我另一个问题。 我尝试过一个简单的测试,从我的Categories表中检索2列:CategoryID和Name。 我最初尝试了以下内容: using (MyEntities db = new MyEntities()) { var model = from c in db.Categories select new Category { CategoryID = c.CategoryID, Name = c.Name }; return View(model); } 这给了我在尝试迭代视图中的模型时ObjectContext被处置错误。 在阅读完这个问题后 ,我尝试将return语句移到using块之外,并在模型上调用AsEnumerable(),如下所示: IEnumerable model; using (MyEntities db = new MyEntities()) { model = from c in db.Categories select […]

在C#中使用Dispose()的终结器

请参阅MSDN的代码示例:( http://msdn.microsoft.com/en-us/library/b1yfkh5e ( v=VS.100 ) .aspx ) // Design pattern for a base class. public class Base: IDisposable { private bool disposed = false; //Implement IDisposable. public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { // Free other state (managed objects). } // Free your […]

使用临时文件流进行处理

假设我想定义一个使用Path.GetTempFileName()方法创建临时文件的TempFileStream类。 当不再需要TempFileStream的对象时,必须删除临时文件,例如关闭或处置: class TempFileStream: FileStream { string m_TempFileName = Path.GetTempFileName(); public TempFileStream(FileMode fileMode): base(m_TempFileName,fileMode) {} /// … public ovverride Dispose(bool disposing) { /// ??? } } 我该如何简单安全地实现这一点?

终结器和处理

我有一个名为BackgroundWorker的类,它有一个不断运行的线程。 要关闭此线程,名为stop to的实例变量必须为true 。 为了确保在使用完类时释放线程,我添加了IDisposable和一个调用Dispose()的终结器。 假设stop = true确实导致此线程退出,这个sippet是否正确? 可以从终结器中调用Dispose ,对吗? 如果objectinheritance了IDisposable ,终结器应该总是调用Dispose ,对吧? /// /// Force the background thread to exit. /// public void Dispose() { lock (this.locker) { this.stop = true; } } ~BackgroundWorker() { this.Dispose(); }

识别IDisposable对象

我必须检查一些其他人有一些内存泄漏的代码。 现在我正在搜索一次性对象以使用using语句对它们进行包围,我想知道是否有一种快速方式告诉你所有声明的一次性对象。我的意思是像resharper或另一个visual studio插件。 谢谢。

内存泄漏问题

自从我被要求修复一个有内存泄漏问题的C#应用​​程序以来,我一直在阅读很多内容,但我没有找到这两个问题的答案: 请考虑以下代码: private static ArrayList list = new ArrayList(); public void Function() { list.add(object1); list.add(object2); //didn’t call clear() prior to reusing list list = new ArrayList(); } 由于列表在创建新列表之前未被清除,这是否会产生某种垃圾,在静态列表本身被释放后不会被释放? 第二个问题是关于Form.Dispose()。 我看到设计师视图(即标签,图片框)上的许多控件都需要进行处理。 似乎在Form上调用Dispose()会导致所有这些类型的控件也被处理掉(如果我错了,请纠正我),这很奇怪,因为设计师添加了一个覆盖的void Dispose(bool disposing)方法,没有这样的事。 我假设这发生在基本Form类的void Dispose(bool disposing)方法中。 上面的问题是我不清楚我需要做些什么才能确保正确处理所有Form的资源。 我不明白Form如何知道它需要处理哪些对象。 例如,如果在我的表单中我有一个自定义IDisposable对象的字段,表单是否知道它需要处理? 或者我应该添加自己发布对象所需的代码? 另外,如果我确实需要添加代码来处理某些对象,那么我该如何处理设计者已经覆盖void Dispose(bool disposing)方法的事实呢? 我应该编辑设计器生成的代码还是有更简洁的方法来执行此操作? 我希望这不要令人困惑,这有点难以解释。 谢谢