簡體   English   中英

using語句中成員的范圍

[英]Scope of members inside using statement

我對以下代碼以及using語句的范圍及其對象處置感到困惑。

using(DbFactory db = new DbFactory())
{
   Repository repo = new Repository<someobject>(db);
   result = repo.Get(somecondition);
}

在這段代碼中,在執行using塊之后, DbFactory將被處置嗎?
在using語句中使用的repo變量的范圍是什么?
DbFactoryRepository ,它具有一個成員變量,該成員變量將保存DbFactory 那么這將處理DbFactory嗎?

編輯1:

Repository repo;
ResultObject result;
using(DbFactory db = new DbFactory())
{
   repo = new Repository<someobject>(db);
   result = repo.Get(somecondition);
}

public class Repository
{
    private _dbFactory;

    public Repository(DbFactory dbFactory)
    {
        _dbFactory = dbFactory;
    }
}

現在,在using語句之后DbFactory是否會被處置?

repo變量的范圍(在第一種情況下)是using語句。 您不能在using語句之外引用它,因為它是在其中聲明的。

由於您尚未顯示result變量的聲明, result我們無法確定result變量的范圍,但它至少“比using語句大”。

更有趣的是,在處置DbFactory之后, result值所引用的對象的可用性如何。 基本上,這是特定於實現的……我希望,如果訪問任何result屬性都需要進一步的數據庫查詢(例如,獲取由外鍵引用的對象),則它將失敗,但是已經獲取的任何內容都應該可以。

至於處置的時間安排DbFactory將在using語句的末尾處置。 這與垃圾回收是完全分開的,並且大概Repository對象仍然可以引用它-但是工廠處置后,它可能無用。 因此,如果在using語句之后調用repo.Get(...) 則可能會看到異常,具體取決於該代碼對工廠的實際作用以及所處置工廠的行為。 同樣, 處置不是垃圾收集 它只是調用Dispose方法-CLR並不以任何特殊方式關心它。

DbFactory是否會被處置?

是。

在using語句中使用的repo變量的范圍是什么?

repo的范圍是它所包含的塊,因此包裝了一對大括號('{','}')。在這種情況下,它恰好與using語句的主體一致,是。

如果該回購協議也是一次性的,那么您可能還希望對其進行處置,例如:

using(DbFactory db = new DbFactory())
using(Repository repo = new Repository<someobject>(db))
{
   result = repo.Get(somecondition);
}

這個:

Repository repo;
ResultObject result;
using(DbFactory db = new DbFactory())
{
   repo = new Repository<someobject>(db);
   result = repo.Get(somecondition);
}

與此相同:

Repository repo;
ResultObject result;
{
    DbFactory db = new DbFactory()
    repo = new Repository<someobject>(db);
    result = repo.Get(somecondition);
    db.Dispose();
}

因此,盡管db對象本身不會消失(對它的引用將保留在Repository實例中,但它將處於Disposed / Closed狀態。根據DbFactory的實現,可能會破壞您的代碼。

您沒有提供完整的代碼及其應執行的操作,但我認為您應該朝這個方向發展:

  1. 在您的Repository對象中實現IDisposable,並在其中放置DbFactory:

     public class Repository : IDisposable { private _dbFactory; public Repository(DbFactory dbFactory) { _dbFactory = dbFactory; } public void Dispose() { _dbFactory.Dispose(); } } 
  2. 現在像這樣使用它:

     ResultObject result; using (Repository repo = new Repository(new DbFactory()) { result = repo.Get(somecondition); } 

或使用嵌套使用:

using (DbFactory db = new DbFactory())
{
    using(Repository repo = new Repository(db))
    {
        result = repo.Get(somecondition);
    }
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM