溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C# static 干貨全解析

發(fā)布時(shí)間:2020-06-21 10:19:32 來源:網(wǎng)絡(luò) 閱讀:2268 作者:zbqdly 欄目:編程語言

講解順序

  1. 背景

  2. 靜態(tài)字段

  3. 靜態(tài)函數(shù)

  4. 靜態(tài)方法

  5. 疑問解答



背景

  • static來源

在編寫類的時(shí)候,有時(shí)候需要類里面的某個成員具有唯一性,也就是,對所有的對象都保持只有一個的狀態(tài)。比如創(chuàng)建***,我們都是中國人,但總不能每個人都要保存一個中國人字段吧,用一個就夠了。

  • static作用

MSDN說:使用 static 修飾符聲明屬于類型本身而不是屬于特定對象的靜態(tài)成員。也就是說,用static修改的對象是一個類的全部成員,不屬于某個類特有的。比如,轎車有四個輪子,而不是某種轎車有四個輪子。

  • static特性

2.訪問不需要聲明類對象。比如

Console.Write();//Write()這就是一個靜態(tài)方法,不需要new Consolo();

 2.static對象具有唯一性,無論是否產(chǎn)生了對象或無論產(chǎn)生了多少對象的情況下,某些特定的數(shù)據(jù)在內(nèi)存空間里只有一份。也就是說,你無論new多少類成員,靜態(tài)變量只有一個,要變都變。



靜態(tài)字段

所謂靜態(tài)字段,也就是有static修改的字段啦(對,就是廢話o(∩_∩)oC# static 干貨全解析 )。

  • 作用

無論創(chuàng)建多少對象,靜態(tài)字段代表的數(shù)據(jù)在內(nèi)存空間中只有一個。比如說系統(tǒng)時(shí)間,無論你安裝了多少軟件,想知道現(xiàn)在幾點(diǎn)了,都只有一個參考值,如果你改變了這個時(shí)間,那么其他軟件獲取的時(shí)間也都改變了。(當(dāng)然,只是舉例,具體咋訪問時(shí)間的,俺不管)。

  • 操作順序

靜態(tài)字段是在類操作(實(shí)例化、調(diào)用靜態(tài)方法等)的時(shí)候第一個被實(shí)例化的對象。第二個是靜態(tài)構(gòu)造函數(shù),而且他倆都只能被調(diào)用一次。

  • 特性

  1. 因?yàn)殪o態(tài)成員本身就是為了全局唯一性而生的,當(dāng)然靜態(tài)成員在整個函數(shù)內(nèi)部相當(dāng)于了全局變量。

  2. 靜態(tài)成員只能被初始化一次,就是在第一次對這個類進(jìn)行操作的時(shí)候創(chuàng)建。其他對整個類進(jìn)行操作的時(shí)候,因?yàn)殪o態(tài)成員已經(jīng)有了,自然不會再創(chuàng)建。(就是給菜鳥寫的廢話,不然很多人會有疑問,比如我。)

  • 舉例

C# static 干貨全解析

如上圖,每次創(chuàng)建實(shí)例的時(shí)候,構(gòu)造函數(shù)對兩個字段進(jìn)行+1,但是結(jié)果不一樣,這就是static修飾的字段的唯一性。



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

  • 作用

靜態(tài)構(gòu)造函數(shù)一般用來初始化靜態(tài)變量,不會初始化非靜態(tài)變量;但是因?yàn)榉庆o態(tài)構(gòu)造函數(shù)也能操作靜態(tài)變量,所以就比較少用靜態(tài)構(gòu)造函數(shù)了。

  • 操作順序

無論對類進(jìn)行何種操作,靜態(tài)構(gòu)造函數(shù)總是除了靜態(tài)字段以外第一個被操作的方法,比非靜態(tài)參數(shù)、非靜態(tài)構(gòu)造函數(shù)都要提前。

  • 特性

  1. 只能操作靜態(tài)成員,因?yàn)榉庆o態(tài)成員需要實(shí)體引用。

  2. 整個生命周期只會運(yùn)行一次,且不可被調(diào)用。

  3. 靜態(tài)構(gòu)造函數(shù)不能有修飾符,因?yàn)橹挥邢到y(tǒng)才能調(diào)用,有沒有public都沒用;它也不能有輸入?yún)?shù)。

  4. 如果類里面含有Main方法,則先執(zhí)行靜態(tài)構(gòu)造函數(shù);

  • 舉例

    class A
    {
        public static int X;

        static A()
        {
            X = B.Y + 1;
        }
    }
    class B
    {
        public static int Y = A.X +1;
        static B()
        {
        }

        static void Main(string[] args)
        {
            Console.WriteLine(string.Format("Y={0}, X={1}", B.Y, A.X));//Y=2, X=1;
            Console.ReadLine();          
        }
     }

這是網(wǎng)上一個很有名的static的例子,如果不看答案,能夠算出來才是本事。

  1. 首先,Main()方法在B類里面,所以需要先調(diào)用B類。

  2. 進(jìn)入B類,先對靜態(tài)字段Y分配空間,并默認(rèn)賦值為0;注意,在這里Y已經(jīng)初始化好了。

  3. 因?yàn)閅=A.X+1;所以操作A類的靜態(tài)字段,現(xiàn)在進(jìn)入A類。

  4. 同樣的,先對A類的X分配空間并賦值為0。然后X=B.Y+1,B.Y已經(jīng)存在了,為0,所以X=B.Y+1執(zhí)行完后,X = 1。

  5. 調(diào)用A的靜態(tài)構(gòu)造函數(shù)。

  6. 完成Y的賦值,Y=A.X + 1,Y=2。

  7. 調(diào)用B的靜態(tài)構(gòu)造函數(shù)。

  8. 這時(shí)才會調(diào)用Main()方法,因?yàn)锳.X,B.Y都完成了初始化并賦值,所以直接寫出答案。

能夠?qū)⑼暾捻樞蛎枋龀鰜?,static一般的面試題都難不住你了(我的意思是我很牛C# static 干貨全解析掰)



靜態(tài)方法

  • 應(yīng)用

    靜態(tài)方法一般用于頻繁調(diào)用又不經(jīng)常修改的地方。比如連接數(shù)據(jù)庫的基本語句。當(dāng)然,這個特性也是因?yàn)殪o態(tài)方法無法被繼承,無法進(jìn)行擴(kuò)展有關(guān)。

  • 操作順序

    靜態(tài)方法會在靜態(tài)字段、靜態(tài)構(gòu)造函數(shù)都操作后才能被調(diào)用。

  • 特性

  1. 靜態(tài)方法調(diào)用時(shí)不需要實(shí)例化類。

  2. 靜態(tài)方法只能引用靜態(tài)方法、字段、屬性。靜態(tài)方法里不能有非靜態(tài)變量。

  3. 靜態(tài)方法一經(jīng)調(diào)用,就不能銷毀,除非整個應(yīng)用程序域都結(jié)束了。所以靜態(tài)函數(shù)不能太多,否則一直占有內(nèi)存。

  4. 因?yàn)殪o態(tài)方法不能訪問非靜態(tài)變量,所以與非靜態(tài)方法耦合度較低,有利于代碼的修改。

  5. 靜態(tài)方法的執(zhí)行效率比非靜態(tài)方法要高,但是因?yàn)槠湟恢闭加脙?nèi)存不能被銷毀,所以不能頻繁使用靜態(tài)方法。




疑問解答

  • 靜態(tài)變量與非靜態(tài)變量最大的區(qū)別是什么?

    最大的區(qū)別在于內(nèi)存的位置。靜態(tài)變量的內(nèi)存是在程序開始執(zhí)時(shí)變量就占用了內(nèi)存,直到整個程序結(jié)束時(shí)變量才釋放內(nèi)存. 非靜態(tài)變量是在程序運(yùn)行到該步的時(shí)候分配內(nèi)存,并在執(zhí)行完后自動銷毀。所以:靜態(tài)變量的值只會初始化一次,后面每次訪問,都是上次處理過的值。

  • 為什么靜態(tài)變量不需要實(shí)例化就能訪問。

    因?yàn)轭愒诔跏蓟臅r(shí)候,就已經(jīng)為靜態(tài)變量分配好了內(nèi)存空間,不需要實(shí)例化就能準(zhǔn)確找到它們的位置;而非靜態(tài)成員必須在實(shí)例化類對象以后,才能確定它們的內(nèi)存位置;

    因此也有這樣的說法,靜態(tài)成員是屬于類,而非靜態(tài)成員屬于類的對象

  • 為什么靜態(tài)方法里面不能訪問非靜態(tài)變量,也不能創(chuàng)建非靜態(tài)變量?

    因?yàn)榉庆o態(tài)變量需要實(shí)例化才能確認(rèn)其內(nèi)存中的位置,才能調(diào)用,而靜態(tài)函數(shù)是不需要實(shí)例化的,所以靜態(tài)方法不能使用

  • 為什么方法內(nèi)部不能聲明靜態(tài)變量?

    因?yàn)殪o態(tài)變量是類所有實(shí)例的共用變量,也就是在該類的范疇內(nèi)是個全局變量。而如果在方法內(nèi)部定義靜態(tài)變量,則會導(dǎo)致定義的靜態(tài)變量是一個局部變量,如此定義自然會出錯。

  • 靜態(tài)成員的聲明周期

    靜態(tài)成員的生命周期是整個應(yīng)用程序域的生存周期.也就是從操作含有靜態(tài)成員的類開始,一直到整個應(yīng)用程序結(jié)束。



以上信息都是我參考無數(shù)資料自己整理的,當(dāng)然有可能出現(xiàn)一些錯誤,歡迎大嬸們指正,我會努力修改好,讓這篇文章作為一篇優(yōu)秀的static參考資料

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI