[英]Using 'as IDisposable' in a using block
編輯:我的問題不是關於使用塊及其工作原理。 我的問題是關於兩種方法的區別,如下所示。
我正在閱讀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;
}
}
知道為什么作者以第一種方式而不是第二種方式編寫它?
這通常是由於對語言功能的誤解。 你寫它的方式是用C#寫它的自覺方式:
using (var repo = this.respositoryFactory())
{
作者方法的唯一真正優勢是,如果repositoryFactory
可能會返回一個不實現IDisposable
的類型。 通過using (repo as IDisposable)
編寫代碼,相同的代碼可以處理非一次性類型。
大多數時候,這不是問題。 但是,工廠可以選擇返回IDisposable
類型。 例如,假設此方法是在泛型類中完成的,並且repositoryFactory
返回了一個IRepository<T>
,則該類型可能會或可能不會實現IDiposable
,在這種情況下,此方法可以處理這兩種情況而不會強加IDisposable
約束在通用類型上。
說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()
在代碼中觀察到的非常相似。
如果在使用塊中的某個地方代碼失敗,或達到異常點。 它保證回購正在處理。
兩條線之間的區別在於沒有區別。 施展到IDisposable不是必須的,它純粹是理論上的。 可能的差異
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.