# static 和非 static 到底差在哪? 在 C# 中,static 和非 static 的背後邏輯差異主要在於它們如何在內存中處理,以及它們的行為與生命周期。 ### 1. Memory Allocation(內存分配) <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/rkrJpqD6A.jpg" alt="memory" width="250"/> </div> - Static(靜態): 靜態成員在應用程序啟動時就被分配內存,並且它們的內存是全局共享的。這意味著所有使用這個類別的實例共用相同的靜態成員。靜態成員存在於類別的靜態區域,不隨類的實例而變化。 - Unstatic(非靜態): 非靜態成員與每個對象實例相關聯,當你創建類別的實例時,內存才會為這些成員分配。每個實例都有自己的一份非靜態成員,不會與其他實例共享。 ### 2. Lifetime(生命周期) <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/ByZO09DTA.png" alt="memory" width="150"/> </div> - Static(靜態): 靜態成員的生命週期與應用程序相同,當應用程序啟動時它們被創建,應用程序結束時被銷毀。這導致靜態成員無法被垃圾回收機制回收,因為它們始終存在於內存中。 - Unstatic(非靜態): 非靜態成員的生命週期與對象實例相同,當實例被創建時,這些成員也被創建;當實例被銷毀(或不再被引用時),這些成員也會隨之被垃圾回收機制回收。這提供了更靈活的資源管理,尤其是對於需要動態創建和銷毀的數據。 ### 3. Access(存取方式) <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/HyQE1ov6R.png" alt="memory" width="150"/> </div> - Static(靜態): 由於靜態成員與類別本身關聯,而不是與具體的實例,因此可以通過類別名稱直接存取,而無需創建該類別的實例。 - Unstatic(非靜態): 非靜態成員必須通過類別的實例來存取。每個實例都有自己獨立的成員狀態,因此每個實例的數據是獨立的,不會相互影響。 ### 4. Performance(性能差異) <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/HJ5qkiv60.jpg" alt="memory" width="150"/> </div> - Static(靜態): 靜態成員的存取速度通常會比非靜態成員更快,因為靜態成員的地址是已知且固定的。在多個實例之間,共享一個靜態成員可以減少內存使用。 - Unstatic(非靜態): 非靜態成員的性能開銷略高,因為每次對象創建時都要分配新的內存。同時,必須根據具體的對象實例進行存取和操作。 ### 5. 適用場景 - Static(靜態):適用於需要全局狀態或跨多個實例共享數據的情況,例如配置信息、計數器、工具方法等。 - Unstatic(非靜態):適用於需要每個實例保持自己的狀態,並且不與其他實例共享狀態的情況,例如物件的屬性、方法等。 --- ### 總結: 靜態和非靜態的背後邏輯在於它們如何在內存中儲存和管理資源,以及它們的生命周期和訪問模式的差異。靜態成員被全局共享且具有持久性,而非靜態成員則與具體實例相關聯,並具有獨立性和靈活性。 <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/Sk1egjwaA.png" alt="memory" width="150"/> </div>