說起靜態類,你可能會聯想到實例類。這兩者並不難區分,前者(靜態類)只在內存中創建一個,而后者(實例類)則是每次實例化后,就會再內存創建一份。今天來簡單聊一下靜態類的理解。
代碼情景:
class Program { static void Main(string[] args) { Person p1 = new Person(); p1.Name = "zs"; p1.LivePlanet = "earth"; Person p2 = new Person(); p1.Name = "ls"; p1.LivePlanet = "earth"; } } public class Person { public string Name { get; set; } public int Age { get; set; } public string Phone { get; set; } public string LivePlanet { get; set; } }
根據以上的情景假如我需要實例化100個對象,而Person中的LivePlanet屬性值都統一為earth,不就得反復重寫100次? 這樣妥嗎?起碼您應該知道違背了DRY原則。
好吧,我們來實現一下通過static 來改善這個代碼:
class Program { static void Main(string[] args) { Person.LivePlanet = "earth" Person p1 = new Person(); p1.Name = "zs"; //p1.LivePlanet = "earth"; Person p2 = new Person(); p1.Name = "ls"; //p1.LivePlanet = "earth"; } } public class Person { public string Name { get; set; } public int Age { get; set; } public string Phone { get; set; } public static string LivePlanet { get; set; } }
我們在Person類把LivePlanet改成static,這樣我們直接可以不需要實例化可以直接Person.LivePlanet = "earth"。這樣的好處不僅在於此,而且這解決了當所有對象都共享同一個信息的時候,不需要重復去實例化再去調用這個對象。
請注意以下幾點:
1.存儲在靜態成員中的信息只有在應用程序退出的時候才會從內存里釋放出來。
2.靜態成員不能通過對象訪問,只能通過類名直接訪問。
3.靜態成員(內容)在內存中只存儲一份。
4.靜態成員,在整個應用程序中任何一個地方都可以訪問的到,所以靜態成員直到程序退出后才會釋放內存。而實例成員,當沒有變量使用就可以被垃圾回收,回收后內存就釋放了.(可以把一些常用的工具函數,封裝到一個靜態類中,使用方便)
現在請您再看這個簡單的改動會有什么問題,我在Person中添加一個靜態方法然后通過this來調用靜態成員。
public class Person { public static void Say() { this.Name = "你好"; } public string Name { get; set; } public int Age { get; set; } public string Phone { get; set; } public static string LivePlanet { get; set; } }
可能在脫離編譯器的情況下,您可能覺得this 就是Person,所以這個調用不應該會存在問題。實際上這邊請您注意我用的是靜態static,而靜態成員訪問實例成員必須要new一個實例。並且this指的是當前的對象,在使用靜態成員的時候因為還沒實例化一個對象,所以這個時候this無法得知自己的身份。
改動如下:
public class Person { public static void Say() { Person p = new Person(); p.Name = "你好"; //this.Name = "你好"; } public string Name { get; set; } public int Age { get; set; } public string Phone { get; set; } public static string LivePlanet { get; set; } }
這才是我們想要的結果。
那什么是靜態類呢?請看如下代碼:
public static class MyStaticClass { public static string Name { get; set; } public static void SayHi() { Console.WriteLine("hi"); } }
觀察以上代碼可以看出靜態類的幾個特點:
1.在靜態類中只能有靜態成員,不能有實例成員
2.靜態類不能創建對象,不能new對象
使用靜態類跟使用靜態成員的情景其實是一樣的,即在整個應用程序中要共享數據的時候可以使用靜態類。所以對於那些類中包含有大量的方法,並且類不需要創建對象的時候,可以使用靜態類。