最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析C#靜態(tài)類,靜態(tài)構造函數(shù),靜態(tài)變量

 更新時間:2016年06月07日 12:01:34   作者:jerrylsxu  
這篇文章主要介紹了淺析C#靜態(tài)類,靜態(tài)構造函數(shù),靜態(tài)變量 的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下

靜態(tài)變量

靜態(tài)變量位于棧上,它是一個全局變量,在編譯期就已經(jīng)生成。

public class Cow
{
public static int count;
private int id;
public Cow()
{
id = ++count;
}
}

客戶端創(chuàng)建2個Cow的實例,并打印靜態(tài)變量count。

static void Main(string[] args)
{
Console.WriteLine(Cow.count);
Cow cow1 = new Cow();
Cow cow2 = new Cow();
Console.WriteLine(Cow.count);
} 

結果:

0
2

○ 在創(chuàng)建Cow實例之前,全局就已經(jīng)有了count這個靜態(tài)變量
○ 如果在static之前用private修飾,就不可以通過"類名.靜態(tài)字段名"來訪問靜態(tài)字段,但全局的靜態(tài)字段始終存在

在堆和棧上的表現(xiàn),如下圖:

靜態(tài)構造函數(shù)

在Cow類中添加一個靜態(tài)構造函數(shù)。

public class Cow
{
public static int count;
private int id;
public Cow()
{
id = ++count;
}
static Cow()
{
count = new Random().Next(100);
}
}

在構造函數(shù)和靜態(tài)構造函數(shù)中,都對Cow的靜態(tài)字段賦值?,F(xiàn)在我們想了解靜態(tài)構造函數(shù)在什么時候觸發(fā)。是在用構造函數(shù)創(chuàng)建實例的時候觸發(fā)嗎?會不會在設置Cow的字段或屬性值的時候觸發(fā)?在客戶端,通過打印靜態(tài)字段count的值來了解靜態(tài)構造函數(shù)什么時候被觸發(fā)。

static void Main(string[] args) { Cow cow1 = new Cow(); Console.WriteLine("創(chuàng)建第一個Cow實例后count為:"+ Cow.count); Cow cow2 = new Cow(); Console.WriteLine("創(chuàng)建第二個Cow實例后count為:" + Cow.count); }

○ 靜態(tài)構造函數(shù)在創(chuàng)建第一個Cow實例的時候被觸發(fā)

○ 在創(chuàng)建第二個Cow實例的時候,靜態(tài)構造函數(shù)沒有被觸發(fā),而是通過構造函數(shù)創(chuàng)建實例

○ 靜態(tài)構造函數(shù)只執(zhí)行一次

由此,我們是否可以這樣定論:靜態(tài)構造函數(shù)是在創(chuàng)建第一個實例時候被觸發(fā)的?

橫看成嶺側成峰,來換個角度思考這個問題。在為類的字段賦值時,會不會觸發(fā)靜態(tài)構造函數(shù)呢?

把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("靜態(tài)構造函數(shù)被觸發(fā)后count為:" + Cow.count);
Console.WriteLine("靜態(tài)構造函數(shù)被觸發(fā)后whatever為:" + Cow.whatever);
}
}

客戶端修改為:

static void Main(string[] args)
{
Cow.count = 100;
Cow cow1 = new Cow();
Console.WriteLine("創(chuàng)建第一個Cow實例后count為:"+ Cow.count);
Cow cow2 = new Cow();
Console.WriteLine("創(chuàng)建第二個Cow實例后count為:" + Cow.count); 
} 

○ 在為Cow的字段賦值之前,靜態(tài)構造函數(shù)被觸發(fā)

○ 接著創(chuàng)建Cow實例,靜態(tài)構造函數(shù)不會被再次觸發(fā)

○ 靜態(tài)構造函數(shù)只執(zhí)行一次

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

靜態(tài)類

首先創(chuàng)建一個類,包括靜態(tài)成員和非靜態(tài)成員。

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("我不是靜態(tài)方法~~");
}
}

在客戶端,既可以通過"類名.靜態(tài)方法名稱"調(diào)用方法,也可以通過類的實例調(diào)用方法。

static void Main(string[] args)
{
Logger.InitializeLogging();
Logger.LogMsg("日志被記錄下了~~");
Logger.CloseLog();
Logger logger = new Logger();
logger.DoSth();
}

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

修改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);
}
}

在客戶端,更不能創(chuàng)建Logger的實例,只能通過"類名.靜態(tài)方法名"調(diào)用方法。

static void Main(string[] args)
{
Logger.InitializeLogging();
Logger.LogMsg("日志被記錄下了~~");
Logger.CloseLog();
} 

總結:

○ 靜態(tài)變量屬于全局,位于棧上

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

○ 靜態(tài)類中不能有實例成員

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

相關文章

  • C#序列化與反序列化(Serialize,Deserialize)實例詳解

    C#序列化與反序列化(Serialize,Deserialize)實例詳解

    這篇文章主要介紹了C#序列化與反序列化(Serialize,Deserialize)的方法,實例分析了C#序列化與反序列化的常見技巧,需要的朋友可以參考下
    2015-06-06
  • c#冒泡排序示例分享

    c#冒泡排序示例分享

    這篇文章主要介紹了c#冒泡排序示例分享,需要的朋友可以參考下
    2014-02-02
  • C#對Excel表csv文件的讀寫操作詳解

    C#對Excel表csv文件的讀寫操作詳解

    在C#編程中,CSV(Comma Separated Values)文件是一種常見的數(shù)據(jù)存儲格式,用于存儲表格數(shù)據(jù),如數(shù)據(jù)庫導出或報表,CSV文件以其簡單、易于處理和跨平臺兼容性而受到廣泛使用,本篇文章將深入探討如何在C#中進行CSV文件的讀寫操作,需要的朋友可以參考下
    2024-12-12
  • C#高效實現(xiàn)集合批量添加與刪除操作

    C#高效實現(xiàn)集合批量添加與刪除操作

    在C#中,對集合進行批量操作通常涉及使用集合類型提供的方法和特性,以及可能的循環(huán)或LINQ查詢來高效地處理大量數(shù)據(jù),本文整理了一些常見的方法和技巧,需要的可以了解下
    2025-01-01
  • C#委托與匿名委托詳解

    C#委托與匿名委托詳解

    這篇文章主要為大家詳細介紹了C#委托與匿名委托的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C#實現(xiàn)插入排序算法實例

    C#實現(xiàn)插入排序算法實例

    這篇文章主要介紹了C#實現(xiàn)插入排序算法,實例分析了插入排序算法的原理與實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • C#中的Explicit和Implicit詳情

    C#中的Explicit和Implicit詳情

    Implicit提高了代碼的可讀性,但程序員需要自己保證轉換不引發(fā)異常且不丟失信息、Explicit可阻止編譯器靜默調(diào)用可能產(chǎn)生意外后果的轉換操作。前者更易于使用,后者能向閱讀代碼的每個人清楚地指示您要轉換類型,下面就和小編來一起學習吧
    2021-09-09
  • C#實現(xiàn)json格式數(shù)據(jù)解析功能的方法詳解

    C#實現(xiàn)json格式數(shù)據(jù)解析功能的方法詳解

    這篇文章主要介紹了C#實現(xiàn)json格式數(shù)據(jù)解析功能的方法,結合實例形式較為詳細的分析了C#解析json格式數(shù)據(jù)的具體操作步驟與相關注意事項,需要的朋友可以參考下
    2017-12-12
  • WPF使用Dragablz構建可拖拽分離的Tab頁程序

    WPF使用Dragablz構建可拖拽分離的Tab頁程序

    這篇文章介紹了WPF使用Dragablz構建可拖拽分離Tab頁的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • C#實現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法

    C#實現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法

    這篇文章主要介紹了C#實現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法,其中包括了遍歷與遞歸的應用,需要的朋友可以參考下
    2014-08-08

最新評論

廊坊市| 定边县| 南丰县| 汝城县| 湖南省| 黄骅市| 浪卡子县| 堆龙德庆县| 崇仁县| 北京市| 琼海市| 民乐县| 韩城市| 长岛县| 图木舒克市| 浦江县| 安多县| 绵竹市| 南京市| 衢州市| 同江市| 宜兴市| 昭觉县| 绥芬河市| 醴陵市| 景洪市| 揭阳市| 洱源县| 新巴尔虎右旗| 和田市| 平潭县| 青神县| 离岛区| 永嘉县| 晋宁县| 鹰潭市| 普兰店市| 车险| 临高县| 海南省| 辽源市|