为什么在ASP.NET中要这样使用using语句?

14

再次重构一些代码。在 ASP.NET 页面中发现了其中的一部分:

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

无需释放txtBox,因为它只是对现有控件的引用。您根本不想释放该控件。我甚至不确定这是否会有害——好像会导致底层控件被错误地释放(尽管我还没有看到从这种使用方式中产生任何不良影响)。


1
我认为那里不需要使用。 - Davide Piras
8
看起来原开发人员犯了新手错误,没有完全理解using的作用。 - squillman
7
哇,using 不仅仅适用于命名空间吗?那我要把它运用到所有东西上! - BoltClock
1
@Davide Piras:我认为你是正确的。看起来有人对Using感到兴奋,到处都在使用它。底层对象不应该被处理掉,因为应用程序中仍然会有对它的引用。 - Lazarus
1
当我在使用ImageBitmap类时,如果不正确地使用using语句,我曾经看到过许多负面影响。 - Uwe Keim
显示剩余3条评论
6个回答

7
TextBox从其超类Component继承了IDisposable的实现。该实现会从其站点容器中移除组件(如果有)。

因此,如果文本框实际上位于站点容器中,则执行该操作可能会产生不良影响。此外,在对对象调用Dispose()后,无论如何都不应再次使用它(它不再处于可用状态)。

我建议您避免在ASP.NET Web控件中使用该模式。


4

这是错误的用法,不应该这样使用。我想象中可能存在潜在问题,这些问题不会立即显示出来。文本框的Dispose方法在离开using语句时被调用,但它不会立即被垃圾回收。如果它被回收了,那么当您尝试访问该控件时,以后就会出现问题。


4
TextBox实例可能为空,如果没有找到,因此调用Dispose()会抛出NullReferenceException异常。
我从未在实践中看到过这种模式,但如果您需要使用它,值得处理任何可能的错误。

5
using语句的规范确保如果值为null,则不会调用Dispose() - zinglon
@zinglon 很好的观点,我认为原始编码人员可能认为放置 using 也意味着内部代码仅对非 NULL 参数进行调用,但事实并非如此。 - Cade Roux

2

不需要负面的副作用,但也不是必需的。如果我们在实现IDisposable接口的所有CLR对象上都使用 using (x) { ... } ,大多数C#代码将变得难以阅读。


1
调用Dispose后,对象处于(可能)无法使用的状态,因此肯定存在潜在的不必要的副作用。 - Rune FS

2

实际上,在using语句的括号内,只有该TextBox实例可以被访问,这也许是使用它的主要原因。


可能是一个不错的用法,但他们也可以把它们放在一个裸{}作用域中。至少有一种情况是这种形式,他们嵌套了8个using(不是一个using内的8个)。 - Cade Roux

0

来自 MSDN

在 using 代码块内,对象是只读的,不能被修改或重新赋值。

因此我想你只能在 using 代码块内读取文本框属性,而不能更改它们。


属性肯定会被更改,包括.Text、.Visible和其他属性。 - Cade Roux
3
这句话的意思是,你不能这样做:using (TextBox txtBox = ...) { txtBox = new TextBox(); },因为对象引用是只读的,但对象本身未必是不可变的。 - David Yaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接