再次重构一些代码。在 ASP.NET 页面中发现了其中的一部分:
using (TextBox txtBox = e.Row.Cells[1].FindControl("txtBox") as TextBox)
{
}
无需释放txtBox,因为它只是对现有控件的引用。您根本不想释放该控件。我甚至不确定这是否会有害——好像会导致底层控件被错误地释放(尽管我还没有看到从这种使用方式中产生任何不良影响)。
再次重构一些代码。在 ASP.NET 页面中发现了其中的一部分:
using (TextBox txtBox = e.Row.Cells[1].FindControl("txtBox") as TextBox)
{
}
无需释放txtBox,因为它只是对现有控件的引用。您根本不想释放该控件。我甚至不确定这是否会有害——好像会导致底层控件被错误地释放(尽管我还没有看到从这种使用方式中产生任何不良影响)。
这是错误的用法,不应该这样使用。我想象中可能存在潜在问题,这些问题不会立即显示出来。文本框的Dispose方法在离开using语句时被调用,但它不会立即被垃圾回收。如果它被回收了,那么当您尝试访问该控件时,以后就会出现问题。
TextBox
实例可能为空,如果没有找到,因此调用Dispose()
会抛出NullReferenceException
异常。using
语句的规范确保如果值为null
,则不会调用Dispose()
。 - zinglon不需要负面的副作用,但也不是必需的。如果我们在实现IDisposable接口的所有CLR对象上都使用 using (x) { ... }
,大多数C#代码将变得难以阅读。
实际上,在using语句的括号内,只有该TextBox实例可以被访问,这也许是使用它的主要原因。
using (TextBox txtBox = ...) { txtBox = new TextBox(); }
,因为对象引用是只读的,但对象本身未必是不可变的。 - David Yaw
using
的作用。 - squillmanusing
不仅仅适用于命名空间吗?那我要把它运用到所有东西上! - BoltClockImage
或Bitmap
类时,如果不正确地使用using
语句,我曾经看到过许多负面影响。 - Uwe Keim