靜態屬性不屬於任何例項,也是屬於類的,和靜態變數不同的是,只用在呼叫它的時候,才會初始化,而且每次呼叫都會重新賦值。
靜態建構函式需用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類 ...
非靜態函式,非靜態變數與靜態函式,靜態變數
一 函式 函式的引入可以減少程式的目標 實現程式 的共享。但是,函式呼叫也需要一些時間和空間方面的開銷,因為呼叫函式實際上將程式執行流程轉移到被調函式中,被調函式的程式 執行完後,再返回到呼叫的地方。這種呼叫操作要求呼叫前保護現場並記憶執行的位址,返回後恢復現場,並按原來儲存的位址繼續執行。對於較長...
非靜態函式,非靜態變數與靜態函式,靜態變數
非靜態函式,非靜態變數與靜態函式,靜態變數 一 函式 函式的引入可以減少程式的目標 實現程式 的共享。但是,函式呼叫也需要一些時間和空間方面的開銷,因為呼叫函式實際上將程式執行流程轉移到被調函式中,被調函式的程式 執行完後,再返回到呼叫的地方。這種呼叫操作要求呼叫前保護現場並記憶執行的位址,返回後恢...