2012-11-14 186 views
10

我最近發現C#中的結構可以有方法。靜態結構方法和靜態類方法有什麼區別?

不小心,我發現自己一直在我的代碼中使用空結構的靜態方法,而不是我認爲正在處理的靜態類的靜態方法!

例如

public struct Foo 
{ 
    public static void Bar(Param param) 
    { 
     ... 
    } 
} 

它並不真正被用作結構在這一點上,因爲它沒有屬性可言!

這與使用類的靜態方法(靜態或其他方式)有很大不同嗎?是否有任何理由相互優先? (我的直覺告訴我,使用靜態結構的方法是,至少,不太直觀)

回答

16

沒有,靜態成員屬於而不是類型的實例。聲明靜態類成員和靜態結構成員之間沒有區別(無論在性能還是語義上)。

需要注意的是,如果一個類型的唯一函數是包含靜態成員,則應該使用靜態類。有了結構體,就有一個隱含的,不可改變的公共的,無參數的構造函數。如果該類型沒有任何實例方法,則應刪除創建實例的能力。聲明類static與聲明abstract sealed相同,因此開發人員將無法無意中創建無目標的實例。

+3

聲明一個'static'類具有額外的好處(通過'abstract sealed'),允許編譯器在變量聲明或轉換中將任何類型的用法標記爲錯誤。 –

+0

@mikez同樣,以及將任何實例成員聲明標記爲錯誤。 – cdhowie

+3

@mikez我認爲一個更重要的區別是'abstract sealed class'簡直是無效的C#。 – svick

3

行爲沒有什麼不同。 C#混合結構大大增加了結構和類特徵的交集。就個人而言,我只會使用一個類,因爲它對我來說似乎更加正確(當然更符合大多數語言中的約定)。

+0

可以定義C++結構的方法和構造函數,所以它不是C#中首次引入的全新功能。 – Jagger

+0

如何設置'[StructLayout(LayoutKind.Explicit)]'的結構?這不能被一個班級取代。 –

相關問題