簡體   English   中英

與using塊之外在using塊中創建資源

[英]Creating a resource in the using block vs outside the using block

例如,可以通過以下方式創建可處置資源的新實例:

var resource = CreateNewResource();

以下編碼樣式有什么區別(如果有)?

第一樣式:

var resource = CreateNewResource();
using (resource)
{
    //Use resource
}

第二種風格:

using (var resource = CreateNewResource())
{
    //Use resource
}

如果我們不打算在using塊之外的任何地方使用資源,那么第一種樣式的編碼習慣不好嗎?

即使我們希望在using塊外使用資源,是否應該鼓勵在using塊外使用一次性資源的願望

第一個值得注意的區別是,在您的第一個代碼片段中,變量資源仍然在using塊之后聲明,因此有人可以在使用它之后使用它,這很糟糕。

var resource = CreateNewResource();
using (resource)
{
    //Use resource
}
...
// Unknowingly continues to use resource
resource.BadActOnDisposedObject();

如果您確定要更自由地使用和分配資源,我建議使用try / finally,如下所示:

Resource resource = null;
try
{
    // do whatever
    resource = CreateNewResource();
    // continue to do whatever
}
finally
{
    if (resource != null)
    {
        resource.Dispose();
        resource = null;
    }
}

這樣可以確保在任何情況下都可以處理您的資源。

好吧..所以這顯然是一個壞習慣。

在MSDN上有很好的記錄

您可以實例化資源對象,然后將變量傳遞給using語句,但這不是最佳實踐。 在這種情況下,即使控制對象可能不再有權訪問其非托管資源,該對象在控制離開using塊之后仍保留在作用域中。 換句話說,它將不再完全初始化。 如果嘗試在using塊之外使用該對象,則有引發異常的風險。 因此,通常最好在using語句中實例化對象並將其范圍限制為using塊。

我在網上某處看到了這種風格。 在我自己的代碼中,每當樣式2中的資源聲明語句很長時,我就將聲明從using(){}拉出,然后按照樣式1所述編寫代碼,以使代碼更具可讀性。

暫無
暫無

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

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