2013-11-15 30 views
3

編輯:我的問題不是關於使用塊以及它是如何工作的。我的問題是關於兩種做法的區別,如下所示。在使用塊中使用'作爲IDisposable'

我讀了CQRS之旅指南,我不明白這行代碼:

using (repo as IDisposable) 

這是什麼意思?爲什麼使用它作爲IDisposable?在一個典型的使用塊,一個並不需要使用它作爲IDisposable接口:

using (var repo = this.respositoryFactory()) { // ... } 

任何想法,爲什麼作者寫了它,而不是第一種方式的第二種方式?

這是出現的代碼的方法:

private Conference.Web.Public.Models.Conference GetConference(string conferenceCode) 
{ 
    var repo = this.repositoryFactory(); 
    using (repo as IDisposable) 
    { 
     var conference = repo.Query<Conference>() 
      .First(c => c.Code == conferenceCode); 
     var conferenceModel = 
     new Conference.Web.Public.Models.Conference 
     { 
      Code = conference.Code, 
      Name = conference.Name, 
      Description = conference.Description 
     }; 
     return conferenceModel; 
    } 
} 
+0

很簡單,你不能在使用的塊中使用任何舊的類型,它必須是一個IDisposable類型。 – iamkrillin

+3

如果'as IDisposable'神奇地允許實例在其類沒有實現'IDisposable'的情況下被拋棄?如果它已經實現了'IDisposable',爲什麼這對於'using'語句不夠呢?我從來沒有見過它需要演員。 –

+1

@iamkrillin如果它已經是一次性使用,則不必在使用塊中設置'作爲IDisposable'。 –

回答

10

任何想法,爲什麼作者寫了它,而不是第一種方式的第二種方式?

這通常是由於對語言特徵的誤解。這就是你寫的是把它寫在C#中idomatic方式:

using (var repo = this.respositoryFactory()) 
{ 

唯一的真正優勢,以筆者的做法是,如果repositoryFactory可能潛在地返回的未實現IDisposable一個類型。通過using (repo as IDisposable)編寫代碼,相同的代碼可以處理非一次性類型。

大多數情況下,這不是問題。但是,工廠可能會可選返回IDisposable類型。作爲一個例子,假設這種方法是一個泛型類內完成,並repositoryFactory返回IRepository<T>,該類型可能會或可能不會落實IDiposable,在這種情況下,這種方法會不會對通用堂堂一個IDisposable約束處理這兩種情況將有可能類型。

+0

這不是假設'repositoryFactory'返回實現'IDisposable'的類型?如果它返回對象,例如? – CodeNaked

+3

@CodeNaked'repositoryFactory'必須返回一個IDisposable或者它不會被編譯。 –

+0

@BobHorn - 是的,但是如果它是一種可能或不可能實現'IDisposable'的類型,這可能是「工廠」的情況,那麼您將被要求將其投射到'IDisposable'。這似乎不適用於這種特殊情況,但是您沒有顯示'repositoryFactory'的類型定義。 – CodeNaked

0

如果使用塊中的某處代碼失敗,或達到異常點。它保證回購正在處置。

兩條線的區別在於沒有區別。投到IDisposable並不是祕密,它純粹是理論上的。可能的差異

  • 使用後你想要做一些回購。
  • 吸塵器代碼
+1

我明白了。這兩種方法都不是這種情況嗎?兩者有什麼區別? –

+0

如果'DepositoryFactory'的返回類型沒有實現'IDisposable',但是該方法有時會生成* do *實現'IDisposable'並因此需要清理的類型實例,所以'as IDisposable'將是必需的。 – supercat

3

話說using(X as IDisposable)用指令X標識一個實現IDisposable的類型的特定實例編譯器,則using塊應該警惕這個實例,否則應該警惕什麼。如果方法this.repositoryFactory()的返回類型未實現IDisposable,但此方法有時會返回實現IDisposable的類型實例並期望它被調用,則此類用法將適用。

注意,將被用作工廠可能產生IDisposable對象需要清理的返回類型的任何類型應該實現IDisposable,哪怕只有99.9%,產生的對象將有Dispose方法是什麼也不做,不實際上不得不被稱爲。非通用IEnumerator符合這一描述爲「T」,因而應該有實施IDisposable,但因爲它沒有最好的使用模式可能是:

IEnumerator enumerator = myEnumerable.GetEnumerator(); 
using (enumerator as IDisposable) 
{ 
    ... 
} 

非常相似,在代碼中觀察到的上面使用repositoryFactory()