簡體   English   中英

c#中的靜態類

[英]Static classes in c#

在回答這個問題( https://stackoverflow.com/questions/352317/c-coding-question#352327 )時,它讓我想知道......

將靜態類視為等效於實現單例模式的非靜態類實例是否存在任何危險?

對我來說,唯一看起來很明顯的是靜態類基本上只是作用域函數的集合(這里明確地避免使用“方法”),單例仍然可以實例化,即使你只能有1個> 1> 0。

您可以將單例作為參數傳遞給需要某個接口的對象的東西,您不能在任何地方傳遞靜態類(除非通過一些反射技巧)

在許多方面,靜態類和單例類似。 一個很大的區別是單例可能會實現某些接口,這對於靜態類是不可能的。 例如, Comparer<T>.Default / EqualityComparer<T>.Default提供(通過接口)在排序/字典使用中使用該項的能力。

使用帶有標准序列化框架的單例也是可能的(盡管很棘手)。 使用靜態類,您必須手動管理任何狀態持久性。

它並不完全等同。 例如,您可以將對單例實例的引用作為參數傳遞,但由於沒有實例,因此無法對靜態類進行引用。

“危險”是什么意思?

正如羅伯特古爾德指出的那樣,你對建築的控制權失控了。 您還將獲得更加模糊的施工問題。 靜態類很快就會以靜態初始化程序塊結束。 這些塊在第一次有人引用您的類型時被調用,並且此順序可能沒有您想要的定義。 因此,這些靜態初始化程序的運行順序可能會在您沒有計划的情況下發生變化,並且可能導致奇怪的錯誤。

我可以在靜態類中看到的主要危險是,在編寫單元測試時,它們更難以模擬。 使用單例,您可以創建它,以便您可以在其測試特定功能的位置注入不同的類,使用靜態類這不是那么容易。

不確定C#,但在C ++中,靜態Object在初始化時會被初始化,而你無法直接控制它(特別是在多線程應用程序中)。 所以你需要一個函數來調用你的對象,而不是直接調用它(除非你想要不可移植的代碼)

正如羅伯特之前所說,初始化是靜態類的主要缺點。 靜態類通常會在最后一刻延遲初始化。 但是,您失去了對確切行為的控制,靜態構造函數很慢。

通常,靜態類用於保存全局數據。 全局數據在您的其他對象/類之間創建隱式依賴關系。 因此,在更改此“全局對象”時,您必須保持謹慎。 可以打破你的申請。

在單身實施的背景下,我認為沒有任何危險。 我經常這樣做,通過靜態類來改變單音。 從邏輯上講,如果它是唯一且唯一的,則不需要對象引用。

暫無
暫無

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

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