2009-02-10 28 views
2

重構一些C#類時,我遇到了實現IDisposable的類。我是否應該將Dispose邏輯分成一個部分類文件?

不用考慮,我爲每個實現IDisposable接口的類創建了部分類文件。

例如)對於Stamper.cs - > Stamper.cs + Stamper.Dispose.cs 其中Stamper.cs包含實際邏輯衝壓 和Stamper.Dispose.cs包含處理邏輯

// Stamper.cs 
public partial class Stamper 
{ 
// actual logic 
} 

// Stamper.Dispose.cs 
public partial class Stamper: IDisposable 
{ 
// Implement IDisposable 
} 

當我看了看代碼,Stamper.cs現在看起來會更加清晰易讀(現在約52行而不是100行,其中約50線是一個簡單的清理處置代碼)

我該怎麼過遠遠w這是什麼?

*編輯:謝謝你們的意見 - 我決定把兩個文件放在一起。 我遇到的問題是我實際上在更新實際邏輯後忘記更新IDisposable實現。

此外,在源代碼中的方法之間導航沒有太多問題。 第一個原因似乎不僅僅是一個足以在我的具體案例中堅持一個文件解決方案的理由。

+0

請添加「主觀」標記。 ;) – JohannesH 2009-02-10 20:42:49

+0

「主題」標籤增加:) – Sung 2009-02-10 21:12:51

回答

7

看起來像創建構造函數邏輯的部分類一樣隨心所欲。現在我必須查看兩個文件來製作該課程。部分課程只是真的值得設計師的東西...

8

是的,太過分了。在代碼周圍粘貼一個#Region並摺疊它以至於無法看到它?

1

如果你的清理程序很重,這是可以接受的,但並不理想。

這可能是一個鍋爐板的良好習慣,如暴露事件,繁重的序列化方法和你的情況下內存管理。

寧願部分類比輪廓(#地區)。如果您必須使用部分類或代碼概述來使代碼可讀,這通常表示代碼需要更改。如果代碼對維護這個類是絕對必要的,那麼撕掉類appart並且僅作爲最後的手段使用部分類(或區域)。

就你而言,你可以使用一個類來細化非託管資源並公開一個Dispose。然後在你的其他類中,使用託管對象並且無邏輯地處理它。

如果你的類只是一個簡單的包裝,那麼我會說你的方法是矯枉過正,因爲類的全部要點是處置一個非託管資源。

+0

請解釋區域是一個問題,但部分類不是?無論哪種方式,課程都很麻煩,需要一些額外的組織。將其分割成多個文件與單個文件中的區域相比,更多地體現了我的品味。 – Misko 2009-02-10 20:53:35

+0

區域取決於您的IDE如何配置,而文件不是。例如,我喜歡使用Consolas,它使區域圖標幾乎看不見,無法點擊。此外,在不同文件中使用「隱藏」代碼顯而易見,而某個區域很容易遺漏。 – Coincoin 2009-02-10 20:57:32

6

我希望看到與保證實現IDisposable的資源相同的文件中的dispose邏輯。雖然有一個主觀因素,但我認爲它太離譜了

2

我認爲你的解決方案是不健全的。部分類通常只能用於將開發者代碼與發生器代碼分開。區域通常在爲代碼添加結構方面做得更好。

0

有點奇怪的問題,因爲它只對開發者有影響,完全取決於個人喜好。我只能告訴你我更喜歡什麼,如果處理部分有大量的邏輯,我會這樣做。

0

就我個人而言,我試圖保持我的實例化/初始化邏輯和我的清理/處理邏輯並排,這是一個很好的提醒。

至於部分類,我唯一​​使用它們的時間是如果一個類非常大並且可以分類爲一組方法。隱藏設計器代碼也很棒。

0

我希望在有問題的代碼是在計算機生成時使用分類。如果你有許多共享類似代碼的類(由於各種原因需要重複,而不是被拖入它自己的類中),可以使用幾個模板和一個程序來生成基於這些模板的代碼。在這種情況下,模板將被視爲源文件,然後生成文件作爲中間對象代碼。將模板生成的代碼抽出爲部分類似乎是完全合適的。

在vb.net中,這樣的方法可以很好地允許在IDisposable對象內安全地處理字段聲明,初始化和清理。需要適量的樣板代碼,但之後的字段聲明非常乾淨。例如:

 
' Assuming Option Implicit on: 
Dim MyThingie = RegDisposable(New DisposableThingie) 
' If Implicit wasn't on: 
Dim MyThingie As DisposableThingie = RegDisposable(New DisposableThingie) 

RegDisposable將會是一個類成員,它會將新的DisposableThingie添加到該類所擁有的列表中。該類的Dispose例程將然後處理列表中的所有項目。

不幸的是,在C#中沒有乾淨的方式做類似的事情,因爲字段初始值設定項不能使用即將構造的對象(在vb.net中,字段初始值設定項在構建基本對象後運行)。

相關問題