靜態變數 靜態屬性 靜態建構函式

2021-08-01 10:27:51 字數 1363 閱讀 5753

靜態屬性不屬於任何例項,也是屬於類的,和靜態變數不同的是,只用在呼叫它的時候,才會初始化,而且每次呼叫都會重新賦值。

靜態建構函式需用static修飾,但不能用public或private等關鍵字修飾,因為靜態建構函式不能直接呼叫,無論是直接例項化還是通過class.method的方式。

下面我們看看在類中,靜態變數和靜態建構函式的初始化順序是怎樣的:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace mytest01

}static myclassa()

public

myclassa()}}

當例項化myclassa時,通過斷點,得到如下圖結果

從而可以得知初始化的順序為:靜態變數->靜態建構函式》普通變數->建構函式,因為沒有用到靜態屬性,這裡並沒有初始化。

再來看乙個經典例子

`using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace mytest01

}public class b

static void main(string args)

,x = ", b.y, a.x);

console.readline();

}}}

` 執行結果:

因為啟動的main函式在b類中,所以啟動時會先進入b,按上面的執行順序,會先去初始化靜態變數y,這裡會先預設給y乙個初始值0,由於賦值的**中又呼叫了a類的靜態變數x,因而進入到a類中,先初始化x=0,再執行a類的靜態建構函式,得到x=1(因為y已經有預設初始值0),然後跳回到b中y的賦值語句,得到y=2。

這裡需要注意的是:main函式在哪個類,就先初始化哪個類的靜態變數,如果main函式在兩個類的外部,就是先用到誰,誰先初始化。然後靜態變數初始化都是先預設給乙個初始值再執行賦值操作,如static int a=1,實際可看成a=0,a=1;

好了,能力有限,如有問題,歡迎指正。

靜態建構函式與靜態變數

靜態建構函式 c 物件初始化1.先變數後建構函式。變數先被初始化 然後建構函式被執行 2.先靜態化後例項化。當 乙個類被訪問時 靜態變數和建構函式最先被初始化 接著是物件的例項化變數和建構函式被初始化 3.先派生類後基類。對於變數和靜態建構函式 派生物件在基物件之前被初始化 比如 c類派生自 b類 ...

非靜態函式,非靜態變數與靜態函式,靜態變數

一 函式 函式的引入可以減少程式的目標 實現程式 的共享。但是,函式呼叫也需要一些時間和空間方面的開銷,因為呼叫函式實際上將程式執行流程轉移到被調函式中,被調函式的程式 執行完後,再返回到呼叫的地方。這種呼叫操作要求呼叫前保護現場並記憶執行的位址,返回後恢復現場,並按原來儲存的位址繼續執行。對於較長...

非靜態函式,非靜態變數與靜態函式,靜態變數

非靜態函式,非靜態變數與靜態函式,靜態變數 一 函式 函式的引入可以減少程式的目標 實現程式 的共享。但是,函式呼叫也需要一些時間和空間方面的開銷,因為呼叫函式實際上將程式執行流程轉移到被調函式中,被調函式的程式 執行完後,再返回到呼叫的地方。這種呼叫操作要求呼叫前保護現場並記憶執行的位址,返回後恢...