我可以相信一个对象在超出C#范围时会被销毁并立即调用其析构函数吗?我认为它应该是因为许多常见的编码实践(例如事务对象)都依赖于这种行为,但我不太习惯使用垃圾收集并且对这些语言通常的行为方式知之甚少。谢谢。 最佳答案 不,.Net和C#都依赖于垃圾回收内存管理。因此,在GC发现销毁对象是合适的之前,不会调用析构函数(在.Net中称为终结器)。另外:C#中的大多数“常规”对象没有析构函数。如果你需要析构函数模式,你应该实现IDisposableinterface与DisposePattern.在一次性对象上,您还应该确保使用usingk
我正在开发一个使用CrystalReports进行报告的应用程序。它在ReportDocument对象中打开给定的报表,执行它需要执行的操作,然后关闭报表。using(varreport=OpenReport(reportSourceInfo)){//Dostuffwiththereportreport.Close();}OpenReport方法对源文件进行一些验证并返回一个打开的ReportDocument对象。测试表明此代码可以完成预期的工作,而且看起来没有任何问题。我真正听取建议的问题是,当我对报告项目进行代码分析(CA)构建时,我收到以下CA消息:CA2202:Microsof
我最近注意到VisualStudioDesigner(C#)的一些我不理解的行为,想知道是否有人可以澄清...在我的一些Windows窗体中,设计器生成的代码的第一行是这样的;this.components=newSystem.ComponentModel.Container();在这种情况下,dispose方法在同一个设计器文件中,dispose方法在case“if”条件下放置两个“Dispose”调用,如下所示;protectedoverridevoidDispose(booldisposing){if(disposing&&(components!=null)){componen
关于处理非托管资源的“标准完整”IDisposable实现有很多信息-但实际上这种情况(非常)罕见(大多数资源已经被托管类包装).这个问题侧重于针对更常见的“仅限托管资源”情况的IDisposable的最小实现。1:下面代码中IDisposable的最小实现是否正确,是否存在问题?2:是否有任何理由添加完整的标准IDisposable实现(Dispose()、Dispose(bool)、Finalizer等)超过所呈现的最小实现?3:在这种最小情况下,使Dispose虚拟化(因为我们不提供Dispose(bool))是否可行/明智?4:如果这个最小的实现被一个完整的标准实现替换,包括一
我正在尝试模拟一个SqlDataReaderSqlDataReaderreader=mocks.CreateMock();Expect.Call(reader.Read()).Return(true).Repeat.Times(1);Expect.Call(reader.Read()).Return(false);Expect.Call(reader.HasRows).Return(true);Expect.Call(reader.Dispose);Expect.Call(reader["City"]).Return("Boise");Expect.Call(reader["State
直到现在我总是使用类似的结构从数据库中获取数据并填充数据表publicstaticDataTableGetByID(inttestID){DataTabletable=newDataTable();stringquery=@"SELECT*FROMtbl_TestASTWHERET.testID=@testID";using(SqlConnectioncn=newSqlConnection(Configuration.DefaultConnectionString)){SqlCommandcmd=newSqlCommand(query,cn);cmd.Parameters.Add("@
我应该如何管理带有一次性元素的static类?有什么经验法则吗?基本上,我应该重构并制作以下DisposableDataManager类非-静态还是将所有内容留给GC好吗?.publicstaticclassDisposableDataManager{//ImageListisan'IDisposable'.publicstaticImageListFirstImageList{get;privateset;}publicstaticImageListSecondImageList{get;privateset;}staticDisposableDataManager(){Firs
我的.net服务通过在Main()循环退出之前的finallyblock中调用resourceName.Dispose()来清理其所有非托管资源。我真的必须这样做吗?我认为我不能因为进程正在结束而泄漏任何资源的想法是否正确?Windows将关闭所有不再使用的句柄,对吗? 最佳答案 实现IDisposable的对象可以封装的资源类型没有限制。IDisposable对象封装的绝大部分资源会在进程关闭时被操作系统清理,但有些程序可能会使用操作系统不知道的资源。例如,需要底层数据库不支持的锁定模式的数据库应用程序可能会使用一个或多个表来跟踪
这个问题在这里已经有了答案:Doestheusingstatementdisposeonlythefirstvariableitcreate?(6个答案)关闭8年前。这可能在别处得到解答,但经过一些搜索后,我没有在正常的using上下文之外找到太多关于该主题的内容。我很好奇在usingblock中创建的所有对象是否会像原始对象一样被处理掉。上下文如下:通常我会做这样的事情:using(varconn=newSqlConnection(connectionString))using(varcmd=newSqlCommand(commandText,conn)){//Doeverythin
这不同于thisone因为在那种情况下警告是有效的。在这种情况下,根据接受的答案,警告无效。我在寻找答案时看到了那个问题,它没有回答这个问题。给定以下代码:internalListGetPaletteList(intuserId){using(varstashEntities=newStashEntities())using(varpaletteEntities=newPaletteEntities()){varpaletteList=frompaletteinpaletteEntities.PalettesfromstashinstashEntities.Stasheswherepa