淺析C#靜態類,靜態結構函數,靜態變量。本站提示廣大學習愛好者:(淺析C#靜態類,靜態結構函數,靜態變量)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析C#靜態類,靜態結構函數,靜態變量正文
靜態變量
靜態變量位於棧上,它是一個全局變量,在編譯期就曾經生成。
public class Cow { public static int count; private int id; public Cow() { id = ++count; } }
客戶端創立2個Cow的實例,並打印靜態變量count。
static void Main(string[] args) { Console.WriteLine(Cow.count); Cow cow1 = new Cow(); Cow cow2 = new Cow(); Console.WriteLine(Cow.count); }
成果:
0
2
○ 在創立Cow實例之前,全局就曾經有了count這個靜態變量
○ 假如在static之前用private潤飾,就弗成以經由過程"類名.靜態字段名"來拜訪靜態字段,但全局的靜態字段一直存在
在堆和棧上的表示,以下圖:
靜態結構函數
在Cow類中添加一個靜態結構函數。
public class Cow { public static int count; private int id; public Cow() { id = ++count; } static Cow() { count = new Random().Next(100); } }
在結構函數和靜態結構函數中,都對Cow的靜態字段賦值。如今我們想懂得靜態結構函數在甚麼時刻觸發。是在用結構函數創立實例的時刻觸發嗎?會不會在設置Cow的字段或屬性值的時刻觸發?在客戶端,經由過程打印靜態字段count的值來懂得靜態結構函數甚麼時刻被觸發。
static void Main(string[] args) { Cow cow1 = new Cow(); Console.WriteLine("創立第一個Cow實例後count為:"+ Cow.count); Cow cow2 = new Cow(); Console.WriteLine("創立第二個Cow實例後count為:" + Cow.count); }
○ 靜態結構函數在創立第一個Cow實例的時刻被觸發
○ 在創立第二個Cow實例的時刻,靜態結構函數沒有被觸發,而是經由過程結構函數創立實例
○ 靜態結構函數只履行一次
由此,我們能否可以如許定論:靜態結構函數是在創立第一個實例時刻被觸發的?
橫算作嶺側成峰,來換個角度思慮這個成績。在為類的字段賦值時,會不會觸發靜態結構函數呢?
把Cow類修正為:
public class Cow { public static int count; private int id; public static int whatever; public Cow() { id = ++count; } static Cow() { count = new Random().Next(100); whatever = count + 10; Console.WriteLine("靜態結構函數被觸發後count為:" + Cow.count); Console.WriteLine("靜態結構函數被觸發後whatever為:" + Cow.whatever); } }
客戶端修正為:
static void Main(string[] args) { Cow.count = 100; Cow cow1 = new Cow(); Console.WriteLine("創立第一個Cow實例後count為:"+ Cow.count); Cow cow2 = new Cow(); Console.WriteLine("創立第二個Cow實例後count為:" + Cow.count); }
○ 在為Cow的字段賦值之前,靜態結構函數被觸發
○ 接著創立Cow實例,靜態結構函數不會被再次觸發
○ 靜態結構函數只履行一次
到這裡,關於靜態結構函數被觸發的機會,我們可以如許下結論:不管是經由過程結構函數創立實例,照樣給類的字段或屬性賦值,靜態結構函數是在一切這些舉措之前被觸發的。
靜態類
起首創立一個類,包含靜態成員和非靜態成員。
public class Logger { private static int logNumber = 0; static public void InitializeLogging() { Console.WriteLine("日記初始化"); } static public void CloseLog() { Console.WriteLine("日記封閉"); } static public void LogMsg(string msg) { Console.WriteLine("日記編號為:" + logNumber + ":" + msg); } public void DoSth() { Console.WriteLine("我不是靜態辦法~~"); } }
在客戶端,既可以經由過程"類名.靜態辦法稱號"挪用辦法,也能夠經由過程類的實例挪用辦法。
static void Main(string[] args) { Logger.InitializeLogging(); Logger.LogMsg("日記被記載下了~~"); Logger.CloseLog(); Logger logger = new Logger(); logger.DoSth(); }
假如把一個類設置成靜態類,意味著:這個類的一切一切存在於棧上,是以該類中不克不及有實例辦法,也不克不及創立該類實例。
修正Logger類,把實例辦法去失落。
public static class Logger { private static int logNumber = 0; static public void InitializeLogging() { Console.WriteLine("日記初始化"); } static public void CloseLog() { Console.WriteLine("日記封閉"); } static public void LogMsg(string msg) { Console.WriteLine("日記編號為:" + logNumber + ":" + msg); } }
在客戶端,更不克不及創立Logger的實例,只能經由過程"類名.靜態辦法名"挪用辦法。
static void Main(string[] args) { Logger.InitializeLogging(); Logger.LogMsg("日記被記載下了~~"); Logger.CloseLog(); }
總結:
○ 靜態變量屬於全局,位於棧上
○ 靜態結構函數只被觸發一次,不管是經由過程結構函數創立實例,照樣給類的字段或屬性賦值,靜態結構函數的觸發機會都在這些舉措之前
○ 靜態類中不克不及有實例成員
以上內容是小編給年夜家引見的C#靜態類,靜態結構函數,靜態變量的全體論述,願望對年夜家有所贊助!