單例與靜態類的相同作用
1.單例與靜態類只能擁有一個實例,該實例在應用程序的整個周期中用於保持應用程序的全局狀態。
2.單例和靜態類都可以實現線程安全。
單例與靜態類的區別?
需要記住的是, 靜態是屬於C#中的一種語言功能, 而單例是一種設計模式。所以兩者屬於不同的領域。
1.無法創建靜態類的實例, 但是可以創建單個類的實例, 然后重用。
2.編譯器編譯靜態類, 在內部靜態類視為抽象和密封類。
3.單例的構造函數始終標記私有, 我們無法從單例類外部創建實例。
4.靜態類是在應用程序第一次加載進行初始化, 而單例加載可以懶加載也可以由CLR自動加載。
5.靜態類不能作為參數傳遞, 單例則可以作為參數傳遞。
6.靜態類不能集成接口
7.單例的對象可以克隆, 靜態類不行, 單例的對象可以釋放,靜態類不行。
8.無法使用靜態類實現依賴注入,因為靜態類不是接口驅動。
9.單例代表整個應用程序生命周期的單個對象, 屬於應用程序級別, 而靜態類沒有任何對象指針, 屬於應用域級別。
單例和靜態類的內存管理
靜態變量或者靜態類不存儲在堆棧的內存當中, 而堆棧的內從中存在一些稱之為高頻堆的特定控件, 其中存儲靜態類和靜態變量。
該空間超出了垃圾收集器的范圍, 所以, 內存只有在響應的進程或者AppDomain結束時才會被釋放。
而單例類包含靜態的應用, 所以垃圾回收器無法回收它, 並且僅僅在相應的進程或AppDomain結束時, 靜態類和單例都會被銷毀。