繁体   English   中英

为什么要在ASP.NET中以这种方式使用using语句?

[英]Why would you use the using statement this way in ASP.NET?

再次重构一些代码。 在其中一个ASP.NET页面中看到其中一些内容:

using (TextBox txtBox = e.Row.Cells[1].FindControl("txtBox") as TextBox)
{
}

没有必要处理txtBox,因为它只是对现有控件的引用。 并且您根本不希望控制处置。 我甚至不确定这是不是有害的 - 就像它似乎要求不恰当地处理基础控制一样(尽管我还没有看到它以这种方式使用的任何不良影响)。

TextBox从其Component超类继承其IDisposable实现。 该实现将组件从其站点容器中删除(如果有)。

因此,如果文本框实际驻留在站点容器中,那么这样做可能会产生恶意影响。 此外,在对象上调用Dispose()之后,不管再做什么(它不再处于可用状态),都不应再使用它。

我建议你使用ASP.NET Web控件来避免这种模式。

这是错的,它不应该像这样使用。 我会想象使用它的潜在问题不会立即出现。 在离开using语句时调用文本框dispose,但它不会立即被垃圾收集。 如果它被收集,那么当您尝试访问该控件时,您将遇到问题。

如果找不到, TextBox实例可能为null,因此调用Dispose()将抛出NullReferenceException

我在实践中从未见过这种模式,但如果你需要使用它,那么值得处理任何潜在的错误。

应该没有负面的次要影响,但也没有必要。 如果我们在CLR中实现IDisposable的所有内容上using (x) { ... } ,那么大多数C#代码都是不可读的。

实际上,这里TextBox实例只能访问using语句括号内的上下文,这可能是使用它的主要原因。

来自MSDN

在using块中, 该对象是只读的 ,不能修改或重新分配。

所以我猜你只能在using块中读取文本框属性,但不能更改它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM