簡體   English   中英

在using塊中使用'as IDisposable'

[英]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不是必須的,它純粹是理論上的。 可能的差異

  • 在使用之后你想用repo做點什么。
  • 清潔代碼

暫無
暫無

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

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