【发布时间】:2016-05-23 23:52:02
【问题描述】:
虽然我已经编码了一段时间,但我真的只是勉强进入我所说的中级编码器。所以我理解了dispose()的原理,就是释放为变量和/或资源保留的内存。我还发现有时使用 EF 我必须 dispose() 才能使其他操作正常工作。我不明白的正是需要发布的内容,何时使用 dispose()。
例如,我们不会处理字符串、整数或布尔值等变量。但是在某处我们越过“一条线”,我们使用的变量和/或资源需要被处理掉。我不明白线路在哪里。
在知道何时使用 dispose() 时,是否有一个单一的原则或几个广泛的原则可以应用?
我阅读了这些 SO 帖子(a specific situation、more about how rather than when),但我觉得我不了解知道何时使用 dispose() 的基础知识。我看到的一条评论询问当变量超出范围时是否释放内存,这引起了我的注意,因为在我看到响应为否之前,它不会因为超出范围而被释放,我本来以为当它超出范围时它会被释放。我不想成为第二个链接中的一个人所说的“毫无头绪的开发人员”,尽管我认为这有点苛刻。我们中的一些人仍在学习。
所以这就是为什么我的问题是“什么决定何时真正需要 dispose()?”
我的问题不是如何,而是何时。当然 cmets 知道如何有用,但是即使调用 dispose() 的方法是 Using 语句,我仍然需要知道什么时候。
编辑原始问题:我知道这是一个很长的解释,因为标记为重复的评论注释请求,这不是咆哮,我只是不知道如何确保我将注意力集中在我的精确问题上。很多时候,我们只是因为我们提出问题的方式而绊倒。正如我在这篇长文末尾提到的那样,在我们专注于我的问题之后,我将编辑所有这些,假设我们到达那里。根据我的阅读,我认为这是一个重要的问题。
提议的“回答”帖子是一篇很棒的帖子,但并没有真正回答我的问题。 CodeNotFound 下面的评论也提供了一个 great 链接,但它也没有真正回答我的问题。我提供了有关这些帖子的 cmets,以尝试帮助完善我的精确问题:
When should I dispose my objects in .NET?:第一个答案以评论开头
一次性对象表示持有 CLR 本质上不知道的有价值资源的对象。
不幸的是,我不明白“一次性对象...... CLR 本质上不知道”一词包括什么。 这就是我要问的。我如何知道某物是否属于我必须处置的类别?我们一直在定义要在代码中使用的东西。我们什么时候越界,它就变成了我需要 dispose() 的对象?顺便说一句,我注意到该帖子的作者从未标记答案。我不知道这是否意味着他觉得这个问题没有得到回答,或者只是他的跟进很差,但希望我已经对我希望理解的内容进行了一些改进。当您仔细查看答案时,它们并没有真正解决 哪些 对象需要开发人员操作来处理它们的问题,或者我可能如何知道如何识别 对象。我只是不知道我创建的对象或事物需要我负责处理。我知道 GC 和其他规定开始发挥作用,但同样,这只是如何。似乎很清楚的是,大多数经验丰富的专业开发人员都知道何时需要处理他们创建的东西。我不明白如何知道那个。
Proper use of the IDisposable interface:显然是一个受欢迎的答案(1681 次投票),但标记的答案以
开头Dispose 的目的是释放非托管资源”。
好的,但我的问题是我怎么知道它是一个非托管资源?而且我不明白下面的注释如何适用于需要处理的什么。
如果您在 .NET 框架中找到它,它是托管。如果您自己浏览 MSDN,它是不受管理的...您现在负责清理它。”
我不明白如何使用这种类型的解释来分类我需要 dispose() 和不需要的内容。 .net 框架中有各种各样的东西;如何分离出需要我 dispose() 的东西?我看什么来告诉我我对此负责?
在那之后,答案继续详细说明如何处置(),但我仍然坚持什么需要处置。为了让我的话题更加复杂,那位作者后来说:“所以现在我们将......
摆脱非托管资源(因为我们必须这样做),和
摆脱托管资源(因为我们希望提供帮助)
所以现在我需要考虑处理一组全新的使用内存的对象,我也不知道它们是什么。答案的作者后来说
对于任何喜欢这个答案风格的人(解释原因,所以如何变得显而易见)......
我知道作者是在建议其他文章,但作者认为理解“为什么”使“如何”变得显而易见的建议并不真正合理,因为对一个人显而易见的事情对其他人并不总是显而易见的。即便如此,作者更多地关注为什么和如何,而我的问题是关于何时,这意味着什么需要处理( ),而不是 when 我完成了它。我知道什么时候我已经完成了一些事情,我只是不知道哪些我要负责什么时候我已经完成了他们。
对于大多数开发人员什么需要处理()来说可能是显而易见或本能的,但对我来说并不明显,我相信在我的经验阶段还有很多其他人,我希望就什么进行更集中的对话。当然 why 很有用,但在这种情况下,只有当 why 附加到 what 时。例如:您必须释放 DbContext 因为 CLR 不会释放它 - 因为 解释了为什么,但在这种情况下,它是DbContext 是必须处理的 what。
我希望有一个关于必须处理什么的一般原则,而不是一长串具体项目,这对于像我这样正在寻找简单指南的人来说不是特别有用。 p>
再一次,我知道释放内存很重要,而且很多经验和专业知识都用于学习为什么和如何,但我仍然离开难以理解需要处理的什么。一旦我理解了什么我必须处理(),然后我就可以开始努力学习如何去做。
所以这仍然是一个糟糕的问题吗?假设我们能够更加专注于我所问的内容,我稍后会编辑所有这些解释以使帖子更加简洁。
最终编辑:虽然我上面说过我会编辑掉我最初认为问题中不必要的文本,但我认为最好保留它。我认为提出问题的方式已经帮助我们理解答案的潜力。即使答案永远不会改变,但如果我们不将答案与我们在脑海中构建问题的方式联系起来,我们可能不会真正理解答案。因此,如果这个问题的构架方式与某人有关,我鼓励您完整阅读标记为答案的帖子以及 cmets。虽然最后的答案非常简单,但有很多历史和背景对于理解这个问题的答案很重要。为清楚起见,在有关 dispose() 的讨论的整个过程中,答案也被反复编辑。享受...
【问题讨论】:
-
如果您的类型实现了 IDisposable,请使用 Dispose
-
dispose 是一种确定性清理,其中 GC 不是确定性的。
-
您的新问题已在What is meant by “managed” vs “unmanaged” resources in .NET? 中得到解答。 :)
-
“所以我明白了dispose()的原理,就是释放为变量和/或资源保留的内存。”这正是 Dispose 不适合的。它是释放需要释放的东西,这些东西是非托管内存。
-
@Alan:开发人员倾向于在使用某个概念之前对其进行详细介绍。如果您打算*实现`
IDisposable,这是必要的(但您可能不需要这样做)。如果你打算使用实现IDisposable的对象,Eric Lippert's answer就足够了。
标签: c# .net vb.net entity-framework dispose