簡體   English   中英

在構造函數中使用using

[英]Using using in a constructor

我正在為轉換器的構造函數使用create方法。

public void loadData()
{
    byte [] data = new byte [] {......}; // some byte data in here
    var converter = GetDataConverter(data);
}

現在,在GetDataConverter中,我需要根據二進制數據創建一個內存流(該轉換器是第3方並接收一個流)。如果我這樣編寫GetDataConverter,則會收到一個錯誤消息,告訴我我沒有處理我理解的問題。 我創建了一個MemoryStream,需要處理。

public MyDataConverter GetDataConverter(byte [] data)
{
    return new MyDataConverter(new MemoryStream(data));
}

所以我的解決方案是這樣的:

public MyDataConverter GetDataConverter(byte [] data)
{
    using(var ms = new MemoryStream(data))
    {
       return new MyDataConverter(ms);
    }
}

問題是,我的解決方案正確嗎? 我應該在這里使用“使用”嗎? 一旦超出范圍,“使用”是否將銷毀我的內存流,因此轉換器將無法處理任何事情?

我需要一個答案和一個解釋,我對這里的整個“使用”事物有些含糊。

謝謝

這實際上取決於MyDataConverter的實現。 如果僅在構造函數內部使用MemoryStream來從中檢索某些數據,那么using的解決方案就可以了。 如果OTOH, MyDataConverter保留對MemoryStream的引用以在以后訪問它,則不能在此MyDataConverter它。

如果您無法訪問“ MyDataConverter”的代碼,並且該類型未實現“ IDisposable”,則可以執行以下操作:

public void loadData()
{
    byte[] data = new byte[] { 0 }; // some byte data in here

    using (var stream = new MemoryStream(data))
    {
        var converter = new MyDataConverter(stream);

        // do work here...
    }
}

如果必須多次使用此代碼,並且想重用代碼,則可以執行以下操作:

public void loadData()
{
    byte[] data = new byte[] { 0 }; // some byte data in here

    UsingConverter(data, x =>
    {
        // do work here...
    });
}

void UsingConverter(byte[] data, Action<MyDataConverter> action)
{
    using (var stream = new MemoryStream(data))
    {
        var converter = new MyDataConverter(stream);

        action(converter);
    }
}

暫無
暫無

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

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