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

C# 为什么要在ASP.NET中以这种方式使用using语句?,c#,asp.net,using-statement,C#,Asp.net,Using Statement,再次重构一些代码。在其中一个ASP.NET页面中看到以下内容: using (TextBox txtBox = e.Row.Cells[1].FindControl("txtBox") as TextBox) { } 不需要处理txtBox,因为它只是对现有控件的引用。你根本不希望控制权被处理掉。我甚至不确定这是否有害——好像它会要求对底层控件进行不适当的处理(尽管我还没有看到它以这种方式使用的任何不良影响)。应该没有负面的副作用,但也没有必要。如果我们在CLR中实现IDisposable的所

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

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

不需要处理txtBox,因为它只是对现有控件的引用。你根本不希望控制权被处理掉。我甚至不确定这是否有害——好像它会要求对底层控件进行不适当的处理(尽管我还没有看到它以这种方式使用的任何不良影响)。

应该没有负面的副作用,但也没有必要。如果我们在CLR中实现IDisposable的所有东西上使用(x){…},大多数C#代码都是不可读的。

这是错误的,不应该这样使用。我可以想象,使用它可能会出现一些不会立即出现的潜在问题。在离开using语句时调用textboxs dispose,但不会立即对其进行垃圾收集。如果收集了文本框实例,那么您稍后在尝试访问该控件时会遇到问题。

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

TextBox
从其超类继承了
IDisposable
的实现。该实现将组件从其应用程序中移除(如果有)

因此,如果文本框实际位于站点容器中,那么这样做可能会产生有害影响。此外,在对象上调用
Dispose()
后,无论发生什么情况,都不应再次使用它(它不再处于可用状态)

我建议您在ASP.NET web控件中避免这种模式。

来自:

在使用块中,对象 是只读的,不能修改 或者重新分配


因此,我猜您只能在using块中读取textbox属性,但不能更改它们。

如果未找到
textbox
实例,则可能会为null,因此Dispose()被称为
NullReferenceException


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

我认为在那里不需要使用它。看起来像是原始开发人员的新手错误,没有完全理解
使用
的作用。“哇,
使用
不仅仅是用于名称空间?我要使用所有东西!”@戴维德·皮拉斯:我相信你是对的。看起来有人因为使用它而兴奋,而且到处都在使用它。不应该处理底层对象,因为在应用程序的其他地方仍然会有对它的引用。当我在
图像
位图
类中不正确地使用
时,我看到了很多负面的副作用。我想这可能是一个很好的用途,但他们总是可以将它们放在一个带有裸对象的范围内{}scope。在这种形式中,至少有一种情况下,他们用括号嵌套了8个using(而不是一个using中的8个)。属性肯定会被更改,包括.Text、.Visible和其他。这意味着你不能使用(TextBox txtBox=…){txtBox=new TextBox();}
对象引用是只读的,但对象本身并不一定是不可变的。使用
语句的
规范确保了
Dispose()如果值为
null
@zinglon,则不会调用
,我认为可能最初的编码人员认为使用也意味着只会为非null参数调用内部代码,但事实并非如此。因为obejct处于(潜在的)状态调用Dispose后的不可用状态肯定会产生潜在的不必要的副作用。