即使您“完成”了该控件,页面在呈现时也会访问该控件,因此在构造期间处置它们没有多大意义。在您的一个示例中,您正在使用刚刚配置的控件之一,这也没有意义。
使用完控件后,请调用 Dispose。处置
方法使控件处于不可用状态。调用此后
方法时,您必须释放对该控件的所有引用,以便内存
它所占用的空间可以通过垃圾收集来回收。
控件引发的 Dispose 事件的描述也暗示了预期用途:
当服务器控件从内存中释放时发生,即
当 ASP.NET 页面打开时,服务器控件生命周期的最后阶段
要求。
Source: http://msdn.microsoft.com/en-us/library/system.web.ui.control.dispose.aspx http://msdn.microsoft.com/en-us/library/system.web.ui.control.dispose.aspx
来源:http://msdn.microsoft.com/en-us/library/system.web.ui.control.dispose.aspx http://msdn.microsoft.com/en-us/library/system.web.ui.control.disposed.aspx
也可以看看:https://stackoverflow.com/a/3151072/453277 https://stackoverflow.com/a/3151072/453277
所以理论上:
- 构建控制树。
- 页面开始渲染。
- 页面查看添加到树中的控件。
- 控制措施已被处置。
- 潜在问题。
这是执行IDisposable
(from Control
)。请注意它如何更改容器和事件相关的值。
public virtual void Dispose()
{
if (this.Site != null)
{
IContainer container = (IContainer)this.Site.GetService(typeof(IContainer));
if (container != null)
{
container.Remove(this);
EventHandler eventHandler = this.Events[Control.EventDisposed] as EventHandler;
if (eventHandler != null)
{
eventHandler(this, EventArgs.Empty);
}
}
}
if (this._occasionalFields != null)
{
this._occasionalFields.Dispose();
}
if (this._events != null)
{
this._events.Dispose();
this._events = null;
}
}
何时处置
这并不是说您不应该处置您的资源;而是说您不应该处置您的资源。如果控件需要处置资源,那么它当然可以自由地这样做。也许一个控件访问一个数据库;我会将数据库代码包装在一个using
block inside控制。
实际上,这种风格会为可以更简单地表达的内容创建大量代码。
using (LiteralControl ltlText = new LiteralControl())
{
ltlText.Text = displayName;
cellAssociate.Controls.Add(ltlText);
}
// could become
cellAssociate.Controls.Add( new LiteralControl { Text = displayName } );