2013-07-01 87 views
3

我們可以在構造函數中使用using聲明來聲明對象的實例以備後用。例如。用'using'語句聲明對象用於以後的用途

public class TestClass { 

    private DataClassesDataContext _dataContext; 

    public TestClass(string connString){ 
     using (this._dataContext = DataClassesDataContext(connString)); 
    } 

    private bool someMethod(){ 
     _dataContext.instanceMethod(); // i want to use instance methods wherever needed and define once 
    } 
} 
+1

非常有趣的問題,會打賭'_dataContext'將在初始化結束時處理,但 – Vogel612

+0

您希望通過這樣做可以獲得什麼? – Chris

回答

7

您必須實現IDisposable自己和你的數據上下文調用DisposeDispose方法。

public class TestClass : IDisposable { 

    private DataClassesDataContext _dataContext; 

    public TestClass(string connString){ 
     _dataContext = new DataClassesDataContext(connString); 
    } 

    private bool someMethod(){ 
     _dataContext.instanceMethod(); // i want to use instance methods wherever needed and define once 
    } 

    public void Dispose(){ 
     _dataContext.Dispose(); 
    } 
} 
+0

我不得不讓我的課「密封」才能使用。仍然不明白爲什麼,但謝謝。 – Warz

+1

@Warz如果你的類沒有被密封,你需要使派生類成爲虛擬的,以防派生類需要讓成員處置。有關創建模式的方式,請參閱[Dispose上的MSDN頁面](http://msdn.microsoft.com/zh-cn/library/system.idisposable.dispose.aspx)。 –

6

目前尚不清楚你所期望的using語句這裏。它所要做的就是確保在塊的末尾調用Dispose

所以基本上你會創建一個DataClassesDataContext(我假設你錯過了new關鍵字...),在一個字段中存儲引用,然後立即處理它。這不會很好 - 你應該擺脫using聲明,但很可能使你的課程實現IDisposable,這樣當TestClass的實例被處置時,你就可以處理數據上下文。

0
using (this._dataContext = DataClassesDataContext(connString)); 

相同

try 
{ 
    this._dataContext = DataClassesDataContext(connString); 
} 
catch 
{ 

} 
finally 
{ 
    if(this._dataContext!=null) 
      ((IDisposable)this._dataContext).Dispose(); 
} 

所以你會得到安置在你的構造_dataContext,這將是不再可用。你應該實現IDisposable接口,你就可以聘請using聲明要將這樣的:

using (TestClass test = new TestClass("conn")) 
{ 
    //your code 
} 
+0

現在解釋說,你的OP,而不是一個誰知道你在那裏做什麼的人 – Vogel612

1

根據MSDN:

using語句調用該對象的Dispose方法 正確的方式,並且(如前所示使用它時),它也會導致 對象本身在調用Dispose後立即超出範圍。

使用語句基本上是try/finally的語法糖。

try 
    { 
    _dataContext = new DataClassesDataContext(connString); 
    } 
    finally 
    { 
    if (_dataContext != null) 
     ((IDisposable)dataContext).Dispose(); 
    } 

這樣它應該成爲明顯的是DataContext的範圍中不再存在,因此看着它不能用其他方法,你的願望可以使用。要解決這個問題,你應該讓班級執行IDisposeable