[英]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
變量的范圍是什么?
DbFactory
由Repository
,它具有一個成員變量,該成員變量將保存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的實現,可能會破壞您的代碼。
您沒有提供完整的代碼及其應執行的操作,但我認為您應該朝這個方向發展:
在您的Repository對象中實現IDisposable,並在其中放置DbFactory:
public class Repository : IDisposable { private _dbFactory; public Repository(DbFactory dbFactory) { _dbFactory = dbFactory; } public void Dispose() { _dbFactory.Dispose(); } }
現在像這樣使用它:
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.