我们使用"使用语句"的原因在以下代码中?

时间:2016-06-09 15:43:22

标签: c# asp.net entity-framework using

我无法完全理解我们应该使用" using"阻止在这里

以下代码用于显示两个表名"类型"和"评论"使用EF

从数据库中获取

是代码:

C#

protected void Page_Load(object sender, EventArgs e)    
{    
    using (PlanetWroxEntities myEntities = new PlanetWroxEntities())    
    {
        var authorizedReviews = from review in myEntities.Reviews    
                                where review.Authorized == true    
                                orderby review.CreateDateTime descending    
                                select review;

        GridView1.DataSource = authorizedReviews.ToList();

        GridView1.DataBind();    
    }    
}

这是作者的一些解释:

  

生成模型后,您可以执行LINQ查询   反对它从底层数据库中获取数据。访问   数据,你需要一个DbContext类的实例,这是基础   PlanetWroxEntities类的类。该实例已创建   在代码中的Using块内。使用块(在C#中使用)是   用于包装创建必须处理的变量的代码   一旦你完成它,就会从记忆中清除。因为   myEntities变量与SQL Server保持(稀缺)连接   数据库,最好将使用它的代码包装在一个Using中   阻止,所以对象在块的末尾被破坏了   已发布连接。myEntities对象会公开您可在查询中使用的数据(例如评论和流派):

我有两个问题:

1-为什么我们应该摆脱变量?是因为它占用了内存空间?或者是因为它与SQL Server数据库保持连接,所以我们不需要对象而只需要连接?

2-这意味着什么"连接被释放"?如果连接是对象的一部分,为什么它也没有被破坏?

3 个答案:

答案 0 :(得分:3)

1)using语句的原因是确保在using语句中的代码完成后立即调用myEntities.Dispose()方法。这是必要的,因为PlanetWroxEntities类'基类是DbContext,它保存与数据库的连接。

数据库连接是从数据库连接池获得的宝贵资源,并且只有有限数量的连接可供您的整个应用程序共享。如果您通过using语句(或其他方式)在完成Dispose对象后不立即调用myEntities,那么myEntities对象将继续占用这个数据库连接有一段不确定的时间,直到来自.net内存管理器的垃圾收集代码到处回收由不再使用的myEntities对象所占用的内存。

内存管理器将在那时调用dispose方法。调用Dispose方法后,数据库连接将从对象释放并返回到数据库连接池,当您调用获取数据库连接时(例如创建时),应用程序的其他部分可以获取该数据库连接PlanetWroxEntities类的其他实例。)

using语句的目的是在完成对象后立即调用Dispose方法,以便在这种情况下立即将数据库连接返回到池中。

2)这意味着您的应用程序将释放数据库连接,并将其返回到数据库连接池,现在可以通过应用程序的其他部分获取它。这是一个可以更多地讨论连接池的资源,它将为您提供有关幕后内容的更多背景知识:https://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

在幕后,using语句被实现为finally语句。所以这段代码:

using (PlanetWroxEntities myEntities = new PlanetWroxEntities())    
{
    var authorizedReviews = from review in myEntities.Reviews    
                            where review.Authorized == true    
                            orderby review.CreateDateTime descending    
                            select review;

    GridView1.DataSource = authorizedReviews.ToList();

    GridView1.DataBind();    
} 

变为

PlanetWroxEntities myEntities; 
try{
    myEntities = new PlanetWroxEntities();
    var authorizedReviews = from review in myEntities.Reviews    
                            where review.Authorized == true    
                            orderby review.CreateDateTime descending    
                            select review;

    GridView1.DataSource = authorizedReviews.ToList();

    GridView1.DataBind();   

} finally{
    myEntities.Dispose();
}

在C#的旧时代,我们总是不得不自己编写finally语句来处理一次性对象,以便释放他们的非托管资源。但后来在C#中引入了using语句,以便更容易实现。即使在今天,如果您愿意,也可以自己编写最终声明,但大多数人都喜欢使用声明。

有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/yh598w02.aspx

答案 1 :(得分:2)

PlanetWroxEntities实施IDisposable

IDisposable由包含当您完成对象时需要释放的本机资源的类实现。

所以,回答#1:你应该尽快“摆脱”变量,这样你就不会保留可以释放回系统的原生资源。

using语句可确保在您完成使用实体后正确调用Dispose()。您不仅要释放连接,还要释放任何其他本机资源。

答案 2 :(得分:1)

为什么我们应该摆脱变量?

  

是因为它占用了内存空间吗?

  

或是因为它与SQL Server数据库保持连接   我们不需要对象而只需要连接?

作业(填充网格)在GridView1.DataBind();

内完成

之后你不需要对象或连接。

  

“连接被释放”是什么意思?如果连接是对象的一部分,为什么它也不会破坏呢?

对象myEntities以及它与数据库的连接被销毁。

通常,EF查询返回的实体可以生成进一步的数据库查询。这称为延迟加载

在using语句中包装EF查询可防止延迟加载发生 - 让您了解数据库查询仅在存储库中发生。

相关问题