2011-03-10 64 views
3

我喜歡使用(){}語句來控制範圍和可讀性。您不僅可以創建對象,使用它們,整齊地處理它們,但你也可以使用它像這樣:由於可讀性原因實現IDisposable

假設將myInstance是在代碼中的一些其他地方MyClass的實例 - 即一個方法參數什麼的

爲MyClass
using (var t = myInstance) { 
    t.Foo= "Hello"; 
    t.Bar= "World"; 
    ... 
} 

定義:

public class MyClass : IDisposable 
{ 
    public string Foo {get; set;} 
    public string Bar {get; set;} 
    ... 

    public void Dispose() {} 
} 

這使得代碼更簡潔,更具可讀性(我覺得),當然更容易輸入。然而,爲了廣泛使用這個,你必須實現IDisposable。在這種情況下,不需要MyClass實際處理Dispose中的任何內容,因此它是空的。

我的問題是,以這種方式使用IDisposable有什麼缺點嗎?

我明白,有類似的問題已經在SO上,但我不認爲這些處理使用IDispose(或他們指的是特定的類)。

編輯:

OK,所以我想我是有點specifc,但這裏有一個更廣泛的點。使用語句是一種方便,非常簡潔的方式來定義特定時間的實例,然後您可以將其忽略。它似乎不公平,這種能力應該只限於IDisposable對象。是的,在實例化過程中有一定程度的懶惰,然後設置爲null,但是使用塊使得它非常具體地描述了實例的範圍。 爲什麼我不應該被允許使用非IDisposable類來做到這一點?

+1

是什麼讓你覺得這更具可讀性?恕我直言,少蓬鬆的代碼是。更無用的代碼不是。 – 2011-03-10 13:54:13

+0

我想它是我的部分VB.Net背景 - 我習慣了With塊,這意味着它更容易看到屬性被使用,而沒有前面的實例名稱的垃圾郵件阻礙。 – 2011-03-10 13:57:03

回答

1

我不會(ab)使用using只是爲了限制方法內的變量的範圍,除非這些類型真的需要處理 - 它可能只是混淆了人。在您的例子的情況下,它聽起來更像是你想添加一個額外的方法來構建你的代碼更好的(也可能得到相同的好處可讀性):

public void WorkWithMyInstance(MyInstance t) 
{ 
    t.Foo= "Hello"; 
    t.Bar= "World"; 
    ... 
} 
+0

在設置方法設置多個不同的實例的情況下,這將導致大量的「WorkWith ...」方法 – 2011-03-10 13:57:24

5

如果你的類不需要進行配置,使用using毫無意義。

相反,你可以做一個正常的塊:

{ var t = myInstance; 
    t.Foo= "Hello"; 
    t.Bar= "World"; 
    ... 
} 

不過,我看不到的目的。

從設計的角度來看,你不應該不必要地執行IDisposable
實施IDisposable告訴誰使用你的班級,它使用昂貴的資源,必須完成後處置的人。
如果這不是真的,你只是讓他們的工作更難。

0

您並未真正使用該接口。根據documentation

該接口的主要用途是 釋放非託管資源。

如果你只是使用IDisposable所以你可以用它在using聲明,我認爲,給人的錯覺你的類的用戶。他們可能會將此代碼解釋爲比實際做得更多。

我認爲意想不到的後果將是混亂。

+1

根本問題是該類是否具有*或未來版本或派生可能具有*,a在實例被放棄之前需要執行任何清理操作。實現IDisposable的類傳遞消息「任何創建此類型實例的人都應該確保在該實例被放棄之前調用IDisposable.Dispose。」如果什麼都不在意某個階級或其後代的實例被拋棄,那麼沒有理由給這個階級的用戶帶來這個責任。 – supercat 2011-03-11 16:15:10

+0

@supercat - 完全。那是我想要做的。該類的用戶認爲它實現了IDisposable,所以假設有一些非託管資源正在被類處理。如果你不是(並且不打算如你所說的那樣),那麼這是誤導和混亂。 – 2011-03-11 16:29:48

2

是的,使用塊是try/finally塊的語法糖。

+3

with「Dispose()in」finally「:) – 2011-03-10 14:00:37

+0

這根本不回答問題。 – SLaks 2011-03-10 14:10:13

0

你也可以用這個嗎?

var myclass = new MyClass 
{ 
MyProperty1 = "Property1", 
MyProperty2 = "Property2", 
}; 
+0

我做了很多,但這隻與myclass是一個新實例有關。 – 2011-03-10 13:59:14

+0

@Jon Egerton:是的,它只適用於新實例 – Anuraj 2011-03-10 14:08:28