程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 淺析C#靜態類,靜態結構函數,靜態變量

淺析C#靜態類,靜態結構函數,靜態變量

編輯:C#入門知識

淺析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#靜態類,靜態結構函數,靜態變量的全體論述,願望對年夜家有所贊助!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved