每当我创建控件,它告诉我,我应该为他们使用一个“使用”语句.对于这里发生的事情我有点困惑.使用我的代码看起来像:
using (HtmlTableRow tableRow = new HtmlTableRow()) { tableRow.Attributes.Add("class",isOddRow ? "OddRow" : "EvenRow"); listingTable.Rows.Add(tableRow); addCell(tableRow,row,"issueId"); addCell(tableRow,"Title"); addCell(tableRow,"Type"); addCell(tableRow,"Summary"); }
所以我期待在使用语句的结尾,它将在tableRow上调用处理.但是,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.
所以我希望我现在有一个不可用的对象在我的控制结构中,所以它会破坏或不渲染或某事.但是,一切似乎都很好.
所以我想知道的是为什么所有的控制一次性?是仅仅因为其中一些将会使其全部一次性意味着一个在顶层处理的调用可以被递归传递给所有的子控件?
解决方法
为什么所有的Control对象都实现了IDisposable接口.这样每个父控件都可以调用Dispose对所有的孩子,而无需首先对每个孩子进行测试/转换.每个控件单独负责确定在调用Dispose方法时是否确实有任何需要清除的内容.
文件没有错.在处理过程中实现IDisposable并具有实际清理的状态数据的任何正确写入的对象都应抛出ObjectDisposedException,如果在处理完任何其公共/受保护/内部属性或方法后被访问. (假设Dispose已被调用后的无效状态)有些类型将忽略此规则,如果实际上没有任何要清理的内容,并且不必担心无效状态.
你得到一个建议将其包装在一个使用块的原因是因为分析器没有意识到,listTable将处理其Rows集合,它将处理已添加到其中的每个行对象.另外,如果HtmlTableRow tableRow = new HtmlTableRow()和listingTable.Rows.Add(tableRow)之间抛出异常,则HtmlTableRow对象将被“孤立”,而不在任何其他对象的IDisposable层次结构中.代码分析希望您使用try / finally块立即处理HtmlTableRow(如果发生这种情况).