1. C#靜態(tài)構(gòu)造函數(shù)
1、靜態(tài)構(gòu)造函數(shù)既沒有訪問修飾符,也沒有參數(shù),
C#高級編程 學(xué)習(xí)總結(jié)
。因?yàn)槭?NET調(diào)用的,所以像public和private等修飾符就沒有意義了。2、是在創(chuàng)建第一個(gè)類實(shí)例或任何靜態(tài)成員被引用時(shí),.NET將自動(dòng)調(diào)用靜態(tài)構(gòu)造函數(shù)來初始化類,也就是說我們無法直接調(diào)用靜態(tài)構(gòu)造函數(shù),也就無法控制什么時(shí)候執(zhí)行靜態(tài)構(gòu)造函數(shù)了。
3、一個(gè)類只能有一個(gè)靜態(tài)構(gòu)造函數(shù)。
4、無參數(shù)的構(gòu)造函數(shù)可以與靜態(tài)構(gòu)造函數(shù)共存。盡管參數(shù)列表相同,但一個(gè)屬于類,一個(gè)屬于實(shí)例,所以不會(huì)沖突。
5、最多只運(yùn)行一次。
6、靜態(tài)構(gòu)造函數(shù)不可以被繼承。
7、如果沒有寫靜態(tài)構(gòu)造函數(shù),而類中包含帶有初始值設(shè)定的靜態(tài)成員,那么編譯器會(huì)自動(dòng)生成默認(rèn)的靜態(tài)構(gòu)造函數(shù)。
public class A{ public static readonly int x; static A() { x = B.y + 1; }} class B{ public static int y = A.x + 1; static void Main(string[] args) { Console.WriteLine("x:{0},y:{1},電腦資料
《C#高級編程 學(xué)習(xí)總結(jié)》(http://www.ishadingyu.com)。", A.x, y); Console.ReadLine(); }}
//x=1,y=2。
簡單值類型的全局變量默認(rèn)初始值都是0因?yàn)槿肟诤瘮?shù)在類B,所以程序首先加載B,由于y是B的靜態(tài)成員,類一加載時(shí)便會(huì)計(jì)算y的值,但是發(fā)現(xiàn)y的值是通過賦值的方式獲得的,等號(hào)右邊用到了A的x,此時(shí)會(huì)立即計(jì)算x的值,x是通過類A的靜態(tài)構(gòu)造函數(shù)初始化的,期間又引用了B的Y,此時(shí)y的值還是0(因?yàn)閥的賦值語句還沒執(zhí)行完,故其值還是默認(rèn)的),得到x=0+1=1,繼續(xù)為y賦值得到y(tǒng)=x+1=2.