gpt4 book ai didi

asp.net - 为什么我需要在 ASP.NET 控件上调用 dispose?

转载 作者:行者123 更新时间:2023-12-04 03:30:59 29 4
gpt4 key购买 nike

我正在 VS 中进行一些 ASP.NET 开发,并且刚刚发现了一个有趣的小代码建议(我认为它们来自 coderush,但我可能是错的)。

每当我创建控件时,它都会告诉我应该为它们使用“使用”语句。不过,我对这里发生的事情有点困惑。使用我的代码看起来像:

using (HtmlTableRow tableRow = new HtmlTableRow())
{
tableRow.Attributes.Add("class", isOddRow ? "OddRow" : "EvenRow");
listingTable.Rows.Add(tableRow);
addCell(tableRow, row, "issueId");
addCell(tableRow, row, "Title");
addCell(tableRow, row, "Type");
addCell(tableRow, row, "Summary");
}

所以我期待在 using 语句结束时它会在 tableRow 上调用 dispose。但是,MSDN 库中的文档说:

The Dispose method leaves the Control in an unusable state. After calling this method, you must release all references to the control so the memory it was occupying can be reclaimed by garbage collection.



所以我希望我现在在我的控制结构中有一个不可用的对象,所以它会破坏或不渲染或其他东西。但是,一切似乎都运行良好。

所以我想知道为什么所有控件都是一次性的?仅仅是因为它们中的一些将是一次性的并且使它们全部是一次性的,这意味着在顶层调用 dispose 可以递归地传递给所有子控件吗?

如果不是因为文档明确表示处理控件使其无法使用,我想我会理解......文档是错误的吗?

最佳答案

你实际上不应该这样做。您需要做的是确保listingTable 在Controls 中。集合,以便在处置 Page 时将其处置。然后,listingTable 对象负责正确处理其所有子对象。

这就是为什么所有 Control对象实现 IDisposable 接口(interface)。这样每个父控件都可以调用 Dispose在其所有 child 身上,无需首先测试/转换每个 child 。每个控件单独负责确定在其Dispose 时是否确实有任何需要清理的东西。方法被调用。

文档没有错。任何实现 IDisposable 并具有在处置过程中实际清理的状态数据的正确编写的对象,如果在处置后访问其任何公共(public)/ protected /内部属性或方法,则应抛出 ObjectDisposedException。 (假设在调用 Dispose 后处于无效状态。)如果它们实际上没有任何要清理的内容,则某些类型将忽略此规则,并且不必担心无效状态。

您收到将其包装在 using 中的建议的原因 block 是因为分析器没有意识到 listingTable将处置其Rows集合,它将处理已添加到其中的每个行对象。此外,如果在 HtmlTableRow tableRow = new HtmlTableRow() 之间抛出异常和 listingTable.Rows.Add(tableRow) ,HtmlTableRow 对象将是“孤立的”并且不在任何其他对象的 IDisposable 中等级制度。代码分析希望您使用 try/finally block 来立即处理 HtmlTableRow如果发生这种情况。

关于asp.net - 为什么我需要在 ASP.NET 控件上调用 dispose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150735/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com