激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - 淺析C#靜態類,靜態構造函數,靜態變量

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

2021-11-24 13:46jerrylsxu C#

這篇文章主要介紹了淺析C#靜態類,靜態構造函數,靜態變量 的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下

靜態變量

靜態變量位于棧上,它是一個全局變量,在編譯期就已經生成。

?
1
2
3
4
5
6
7
8
9
public class Cow
{
public static int count;
private int id;
public Cow()
{
id = ++count;
}
}

客戶端創建2個Cow的實例,并打印靜態變量count。

?
1
2
3
4
5
6
7
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類中添加一個靜態構造函數。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Cow
{
public static int count;
private int id;
public Cow()
{
id = ++count;
}
static Cow()
{
count = new Random().Next(100);
}
}

在構造函數和靜態構造函數中,都對Cow的靜態字段賦值。現在我們想了解靜態構造函數在什么時候觸發。是在用構造函數創建實例的時候觸發嗎?會不會在設置Cow的字段或屬性值的時候觸發?在客戶端,通過打印靜態字段count的值來了解靜態構造函數什么時候被觸發。

?
1
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類修改為:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);
}
}

客戶端修改為:

?
1
2
3
4
5
6
7
8
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實例,靜態構造函數不會被再次觸發

○ 靜態構造函數只執行一次

到這里,關于靜態構造函數被觸發的時機,我們可以這樣下結論:無論是通過構造函數創建實例,還是給類的字段或屬性賦值,靜態構造函數是在所有這些動作之前被觸發的。

靜態類

首先創建一個類,包括靜態成員和非靜態成員。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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("我不是靜態方法~~");
}
}

在客戶端,既可以通過"類名.靜態方法名稱"調用方法,也可以通過類的實例調用方法。

?
1
2
3
4
5
6
7
8
static void Main(string[] args)
{
Logger.InitializeLogging();
Logger.LogMsg("日志被記錄下了~~");
Logger.CloseLog();
Logger logger = new Logger();
logger.DoSth();
}

如果把一個類設置成靜態類,意味著:這個類的所有一切存在于棧上,因此該類中不能有實例方法,也不能創建該類實例。

修改Logger類,把實例方法去掉。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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的實例,只能通過"類名.靜態方法名"調用方法。

?
1
2
3
4
5
6
static void Main(string[] args)
{
Logger.InitializeLogging();
Logger.LogMsg("日志被記錄下了~~");
Logger.CloseLog();
}

總結:

○ 靜態變量屬于全局,位于棧上

○ 靜態構造函數只被觸發一次,無論是通過構造函數創建實例,還是給類的字段或屬性賦值,靜態構造函數的觸發時機都在這些動作之前

○ 靜態類中不能有實例成員

以上內容是小編給大家介紹的C#靜態類,靜態構造函數,靜態變量的全部敘述,希望對大家有所幫助!

延伸 · 閱讀

精彩推薦
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
主站蜘蛛池模板: 欧美视频99 | 羞羞网站| 欧美a级大胆视频 | 久久久国产一级片 | 牛牛视频在线 | 欧美精品久久久久久久多人混战 | 国产免费让你躁在线视频 | 欧美一级毛片欧美一级成人毛片 | 国产在线1区 | 国产18视频| 色综合一区二区 | 最近中文字幕一区二区 | 毛片在线免费视频 | av成人在线播放 | 亚洲九九色| xxxxhd73国产 | videos韩国| 久久手机在线视频 | 手机免费看一级片 | 成人精品视频在线 | 日韩av在线网 | 亚洲精品一区中文字幕 | 蜜桃精品视频在线观看 | 日本一级黄色毛片 | 国产精品久久久久久久久岛 | 蜜桃精品视频 | 国产精品免费一区二区三区都可以 | chinesexxxx刘婷hd 国产91在线播放九色 | 国产不卡av在线 | 久成人| 一区二区免费 | 久久久成人动漫 | 欧美一级毛片免费观看视频 | 日本精品婷婷久久爽一下 | 男人的天堂视频网站 | 成人毛片免费视频 | china对白普通话xxxx | 欧美高清一级片 | 亚洲成人第一页 | 国产一级二级在线播放 | 激情宗合网 |