gpt4 book ai didi

asp.net - 解释为什么对象的生命周期在作用域之外

转载 作者:行者123 更新时间:2023-12-03 23:17:15 24 4
gpt4 key购买 nike

我编写了一个类,如下所示。我编写它时考虑到它主要用于网络(即它将在​​ aspx 页面中使用)。

public class TestHelper
{
public TestHelper()
{
HttpContext ctxt = HttpContext.Current;
IHttpHandler RequestHandler = ctxt.Handler;
Page CurrentPage;
CurrentPage = (Page)RequestHandler;
CurrentPage.Unload += new EventHandler(CurrentPage_Unload);
Debug.Print("Open all connection here...");
}

void CurrentPage_Unload(object sender, EventArgs e)
{
Debug.Print("Close all connection here...");
}
}

我已经将我的 aspx 页面的代码写在后面,如下所示:

public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
{
TestHelper helper = new TestHelper();
helper = null;
}

}

尽管将助手分配给“null”,我发现 CurrentPage_Unload() 被执行。为什么会有这样的行为呢?这种行为一般称为什么?

我以这种风格编写类(class)的原因是因为我认为我可以在类(class)中以集中方式最好地管理我的数据库连接。通常人们会在后面的 aspx 代码中调用对象上的方法,例如 helper.IsValid() ,然后调用 helper.ProfileExists() 。每个方法都有自己的数据库连接对象(IDbConnection),以及相应的用于打开/关闭数据库连接的 Open()Close() 调用。我只是觉得我们应该只在代码中执行一次。因此,我使用构造函数来打开数据库连接,并使用 Page 对象的卸载事件来关闭连接对象。以这种方式编写类有什么陷阱吗?

最佳答案

发生的情况是您将委托(delegate)附加到页面的 Unload 事件。即使您的变量设置为 null 后,您的页面仍然存在,并且仍然有一个 Unload 事件,该事件仍然保留对您添加到其中的委托(delegate)的引用。

要删除委托(delegate),您需要使用 -= 语法。

CurrentPage.Unload -= new EventHandler(CurrentPage_Unload); 

关于asp.net - 解释为什么对象的生命周期在作用域之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3281096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com