將不確定變為確定~static被(bei)翻譯成(cheng)靜(jing)態,你是否(fou)贊同
C#中有一(yi)個修飾(shi)符(fu),它(ta)(ta)叫(jiao)static,國人(ren)把它(ta)(ta)叫(jiao)靜(jing)態化(hua)的,它(ta)(ta)可以去修飾(shi)類,方法,屬性,事件等元素。
在(zai)100%的教科(ke)書中(zhong)把(ba)static叫(jiao)做靜(jing)態的,對(dui)于原本就(jiu)很抽象的編程語言來說,無(wu)疑(yi)使它(ta)更加抽象化了,啥(sha)是靜(jing)態,靜(jing)止不動?有點(dian)意思。
先看一個static的應(ying)用場合代碼片斷:
一 靜態類(lei):它在程序初始化時自動被執(zhi)行(xing)
1 public static class ConnectionFactory 2 {...}
二 靜(jing)態(tai)方法和靜(jing)態(tai)屬性:它在類被(bei)第一(yi)(yi)次使用或第一(yi)(yi)次被(bei)實例化時,被(bei)執行
1 public static string Conn=WebConfig.SQLConn; 2 public static DataContext Instance() 3 {...}
三 靜態事件(jian),它與靜態屬性和方法一樣的執行機制(zhi)
1 public static event StartEventHandler Start;
事實(shi)上(shang),以(yi)上(shang)三點是(shi)書本上(shang)經常介紹(shao)的,但我不認為它是(shi)一種學習static的最(zui)好方(fang)式,看一下(xia)我對static的理解:
它是類(lei)本身(shen)的(de)(de)(de)東西,與(yu)(yu)(yu)實(shi)例(li)(li)(li)無(wu)(wu)關(guan),即類(lei)的(de)(de)(de)屬(shu)性,類(lei)的(de)(de)(de)方法,類(lei)的(de)(de)(de)事件等(deng)等(deng),它與(yu)(yu)(yu)實(shi)例(li)(li)(li)無(wu)(wu)關(guan),也就是實(shi)例(li)(li)(li)A與(yu)(yu)(yu)實(shi)例(li)(li)(li)B,對于public static修飾符下的(de)(de)(de)屬(shu)性,方法,事件是平等(deng)的(de)(de)(de),同(tong)時(shi)也是共(gong)享(xiang)的(de)(de)(de)。
如果在一個(ge)(ge)類型B中(zhong)對StaticA類中(zhong)的(de)靜態(tai)屬性Num賦值(zhi),它(ta)會(hui)對所有類中(zhong)使用Num屬性的(de)位(wei)置進行修改(事實上,在內在中(zhong),它(ta)只是一個(ge)(ge)地址(zhi)),你的(de)代碼可能是這(zhe)樣:
1 /// <summary> 2 /// 測試類 3 /// </summary> 4 public class StaticA 5 { 6 /// <summary> 7 /// 靜態屬性 8 /// </summary> 9 public static string Num = "類的(de)屬性"; 10 }
在其它類中,有對(dui)Num屬性的使用(yong):
1 public class A 2 { 3 public string ANum = StaticA.Num; 4 } 5 public class B 6 { 7 public string BNum = StaticA.Num; 8 }
而(er)當我(wo)們在程序的任何一處修改(gai)Num的值時,以上A和B中的實例(li)屬性ANum和BNum也就(jiu)會發生變化了,呵呵。
看一(yi)下,由static實(shi)現的(de)單(dan)件模式(shi)吧(ba)(類只能有一(yi)個(ge)實(shi)例)
1 public sealed class Singleton 2 { 3 // 靜態,易(yi)變(bian)的(de)對象(xiang) 4 private static volatile Singleton instance = null; 5 // Lock對象,線程安全所用 6 private static object syncRoot = new Object(); 7 8 private Singleton() { } 9 10 public static Singleton Instance 11 { 12 get 13 { 14 if (instance == null) 15 { 16 lock (syncRoot) 17 { 18 if (instance == null) 19 instance = new Singleton(); 20 } 21 } 22 23 return instance; 24 } 25 } 26 }
總結一下static的(de)技術要(yao)點:
1 static與具(ju)體(ti)實(shi)例無法,屬性(xing)類本身的東西,而(er)不加static是與當前實(shi)例(new ())有(you)關的個(ge)性(xing)化對(dui)象(xiang)
2 static叫(jiao)它靜態(tai)對象不(bu)如叫(jiao)它全(quan)局對象或類自身(shen)對象
3 static有時可(ke)以提高系統性能,即,在為(wei)對象開(kai)辟一(yi)塊內存(cun)空間