1、靜態類中不能包括非靜態成員,比如非靜態方法、構造函數;非靜態類中可以包括靜態成員。如果不按照這種規則靜態類編譯器會檢查報錯。
簡而言之就是:靜態類中所有的成員必須是靜態成員,但是靜態成員不一定是在靜態類中 。
2、靜態類無法實例化,其成員可以直接使用;非靜態類中的靜態成員不需要實例化,可以直接使用,非靜態類中的非靜態成員必須實例化。
簡而言之就是:不管在哪靜態成員都不需要實例化其所在類,而非靜態成員必須實例化其所在類。
3、靜態成員之所以執行速度快,是因為其在編譯的時候編譯器放在了靜態區(保存自動全局變量和 static 變量)靜態區的內容在總個程序的生命周期內都存在,而普通類的中的非靜態成員需要實例化,值類型在棧中分配空間,引用類型在棧中存引用地址,堆中存實例對象,從而獲取方法,所以速度慢。
靜態成員變量在程序啟動的時候,就全部裝入內存的靜態區中,而不管這些方法、屬性以後有沒有用到
。即使是沒有人再訪問程序,這部分內存仍然不會釋放。
4、靜態成員等同於全局變量,整個系統中存在統一塊區域(靜態區)中,是共享的,比如static into num=0;編譯的時候num就已經是0了,A線程改了其值為1,B線程獲取的時候num就是1了。
5、靜態方法和屬性不能訪問其包含類型中的非靜態字段和事件。
6、靜態方法只能被重載,而不能被重寫,因為靜態方法不屬於類的實例成員。
7、C# 不支持靜態局部變量(在方法內部定義靜態變量)。
8、靜態類是密封類(sealed),無法被繼承。其密封是有自我保護的作用,並且符合編程三大思想之封裝思想,string也是密封類
9、靜態類只能繼承object類,不能繼承其它類。
10、繼承(多態)與靜態本身就是相反的,靜態類的本質:abstract+sealed。