iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
1
Modern Web

C#與ASP.Net入門-我要成為工程師!!系列 第 23

Day23-C#-傳說中的static!!!靜態類別和靜態類別成員

  • 分享至 

  • xImage
  •  

還記得我們在Hello World!時期就有見過static這傢伙了嗎?我們今天終於要來面對它了!XD

什麼是Static?

static是一個修飾詞,用來宣告靜態成員,可以與類別、欄位、方法、屬性、運算子、事件和建構函式搭配使用。

先說結論,以我目前的理解,我覺得宣告成static最重要的影響有三點:

  1. 一開始載入時就存在,就佔據記憶體
  2. 不能也不用new就可以使用(因為已經占據記憶體了)
  3. static的成員是大家共享的(使用同一區記憶體)

於是衍生出的優缺點如下:

  • 優點:
    • 若使用在公用變數,可以共享記憶體
    • 若使用在公用方法,大家都可以叫用
  • 缺點:
    • 無論有沒有使用,它一開始就佔據記憶體空間。
    • 因為共享很難控制存取權限

以下來進行細部的介紹

靜態成員特性

  • 靜態類別僅包含靜態成員
  • 不能使用new實體化
  • 屬密封類別,無法被繼承
  • 沒有執行個體,只能使用私有的建構函式,或者配合靜態建構函式
  • 一般方法只有該類別實體可以叫用,靜態方法使用類別名稱後大家都可以叫用

以下參考一秒看破 static例子

先來設定兩個類別,靜態類別僅包含靜態成員,一般類別也可以有靜態類別

public static class staticClass
{
    public static int price;//靜態類別僅包含靜態成員
    public static void getPrice() { }
}
public class notStaticClass
{
    public int price;
    public void getPrice() { }
    public static void getPriceStatic() { }//一般類別也可以包含靜態成員
    private static int price00;
    public int price1
    {
    get { return price00; }
    set { price00 = value; }
    }
}

1.靜態成員不用new可以直接叫用變數或方法,一般成員需要new實體化物件後才能叫用變數或方法
https://ithelp.ithome.com.tw/upload/images/20190924/20120055HBDu5oqmWA.png

2.靜態方法屬於類別所有(就算非靜態類別亦同),叫用前要打類別名稱notStaticClass,即使不屬於此類別,大家也都可以執行。
一般方法只有該類別實體化後物件才能叫用
https://ithelp.ithome.com.tw/upload/images/20190924/20120055EwXKMuRRtY.png
彥佐涼大大這個例子真的很棒:

例如一個公開類別名叫"我"有個方法叫"叫我起床"
如果他是靜態方法,那誰都可以叫我起床
如果他是非靜態方法,只有我可以叫我自己起床,沒人幫的了我

3.就算宣告了不同的物件,靜態變數仍然是共享的,調整都會變動到
https://ithelp.ithome.com.tw/upload/images/20190924/20120055oOKteFvnrZ.png
輸出結果,兩個都變成10了!!!!
https://ithelp.ithome.com.tw/upload/images/20190924/20120055U9pabUBVLE.png
靜態成員在記憶體只會保留一份,所以可以在同類別的物件之間傳遞資料


靜態建構函式

一般建構函式與靜態建構函式比較如下:

建構函式 靜態建構函式
與類別同名稱
初始化物件
存取修飾詞 public 不能使用
是否有參數 可以選擇 不能有參數
是否有參數 可以多次呼叫 只會執行一次

(圖表來源:從零開始學Visual C# 2015程式設計)


參考資料

C#學習筆記-static到底是神馬鬼東西?
一秒看破static
MSDN-靜態類別和靜態類別成員
MSDN-static
書籍:
從零開始學Visual C# 2015程式設計


上一篇
Day22-C#-怎麼建立類別Class及其建構函式Constructor(建構子)、屬性 (Properties)、欄位 (Field)、方法 (Method)
下一篇
Day24-C#-參數的傳遞方式-Call By Value/Call By Reference/Output parameter
系列文
C#與ASP.Net入門-我要成為工程師!!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
小朱
iT邦新手 4 級 ‧ 2019-09-24 18:34:50

表格的標題好像對錯欄了?

已修改~感謝提醒=)

我要留言

立即登入留言