加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

为什么我需要在ASP.NET控件上调用处理?

发布时间:2020-12-15 18:59:15 所属栏目:asp.Net 来源:网络整理
导读:我在VS中进行一些ASP.NET开发,刚刚发现一个有趣的小代码建议(我认为他们来自coderush,但我可能是错的). 每当我创建控件,它告诉我,我应该为他们使用一个“使用”语句.对于这里发生的事情我有点困惑.使用我的代码看起来像: using (HtmlTableRow tableRow = ne
我在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,"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.

所以我希望我现在有一个不可用的对象在我的控制结构中,所以它会破坏或不渲染或某事.但是,一切似乎都很好.

所以我想知道的是为什么所有的控制一次性?是仅仅因为其中一些将会使其全部一次性意味着一个在顶层处理的调用可以被递归传递给所有的子控件?

我想我会理解,如果不是因为这个文件明确地说,处理一个控制使它无法使用…文档是错误的?

解决方法

你不应该这样做.您需要做的是确保listTable位于“控件”集合中,以便在页面处理时将其进行处理.然后,列表表对象负责正确处理其所有子项.

为什么所有的Control对象都实现了IDisposable接口.这样每个父控件都可以调用Dispose对所有的孩子,而无需首先对每个孩子进行测试/转换.每个控件单独负责确定在调用Dispose方法时是否确实有任何需要清除的内容.

文件没有错.在处理过程中实现IDisposable并具有实际清理的状态数据的任何正确写入的对象都应抛出ObjectDisposedException,如果在处理完任何其公共/受保护/内部属性或方法后被访问. (假设Dispose已被调用后的无效状态)有些类型将忽略此规则,如果实际上没有任何要清理的内容,并且不必担心无效状态.

你得到一个建议将其包装在一个使用块的原因是因为分析器没有意识到,listTable将处理其Rows集合,它将处理已添加到其中的每个行对象.另外,如果HtmlTableRow tableRow = new HtmlTableRow()和listingTable.Rows.Add(tableRow)之间抛出异常,则HtmlTableRow对象将被“孤立”,而不在任何其他对象的IDisposable层次结构中.代码分析希望您使用try / finally块立即处理HtmlTableRow(如果发生这种情况).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读