2014-01-17 65 views
0

我可以有一個擁有資源成員的類,或者至少它實現了IDisposable。這裏是一個例子(只是用於示出我的意思):擁有一個擁有整個對象生命週期資源的類成員是一個好主意嗎?

public class Something 
{ 
    private HMACSHA1 HmacSha1; 

    public Something() 
    { 
     HmacSha1 = new HMACSHA1(); 
    } 

    public byte[] DoIt(byte[] bytes) 
    { 
     return HmacSha1.ComputeHash(bytes); 
    } 
} 

的構件HmacSha1IDisposable實現,因此應該在對象的生命週期的結尾處。我知道這一點,這不是我的問題的一部分,故意排除在這個例子中。它也可以是任何其他類型的資源,如數據庫或網絡連接。

我想知道它是否是一個好主意,讓該成員開放(我指的是在開始創建一次,而不是配置)爲對象的整個生命週期?

或者最好是在需要的地方創建和處理它 - 在上面的例子中的方法DoIt()

有什麼缺點?

回答

2

我認爲這真的取決於對象是什麼以及如何使用它。

構建一次並保持它可能是有意義的,如果對象包含不方便存儲在別處的狀態信息,您需要堅持。

如果對象的方法執行起來很快,但是對象創建和釋放的代價很高,那麼對性能的原因也是有意義的。如果其方法處於性能瓶頸,那麼它將提供性能優勢來保持對象的活性,並消除那些時間敏感的方法調用的構建/銷燬開銷。

考慮:

public Something() 
{ 
    someObject = new SomeObject(); //let's say this takes 350ms 
} 

public byte[] DoIt(byte[] bytes) 
{ 
    return someObject.ComputeHash(bytes); //let's say this takes 3ms 
} 

現在......

private void doSomething() 
{ 
    for(int i = 0; i < 100000; i++) { 
     someList.Add(something.DoIt(someBytes)); //this will take 5 minutes 
    } // but if someObject is created and freed in the loop it will take 
}  // almost ten hours! 

的參數用於動態創建和釋放它的工作在幾乎相同的方式。如果對象很大並佔用大量內存,只有在需要時它纔能有效(如果它不包含任何無法在其他地方有效保存的狀態信息),效率可能更高,只要動態創建和釋放的性能損失與內存佔用的增加相比,該對象很小。

想象一下,Something類的用例將涉及數百個在任何給定時間處於活動狀態的實例。如果他們都保持一個不常使用的持久實例someObject,那麼你的內存佔用數百次會同時存在,而每個Something可能只需要一次。在這種情況下,只需要創建它就好多了。通常情況下,我想最好是說任何對象,結構體或變量都應該只在持久存在的原因時纔會持續存在。如果你不能做出一個明智的論點來保持它,然後釋放它。

+0

聽起來很合理。 –

相關問題