深入解析值型別的初始化過程!

2022-05-02 21:24:13 字數 631 閱讀 1281

struct book

public string author

set

} 下面是初始化**:

static void main(string args)

這段**可以通過編譯,當然如果把struct換成class,馬上就會發生編譯錯誤了:使用了未賦值的區域性變數b.

為什麼struct變數可以不通過book b=new book()的方式而使用欄位呢?

比如:b.author="asdf";//這裡訪問屬性author,會發生編譯錯誤

原因是c#編譯器「認為」設定public欄位是初始化行為,而設定屬性不是初始化行為,的編譯檢查,你通過book b=new book();來初始化會讓編譯器認為b已經初始化了!

大家可能認為book b=new book();會呼叫book的預設無參建構函式,實際上並非如此,對於struct來說,c#編譯器並不會像引用型別那樣產生預設的無參建構函式,而且為了避免混淆,也不允許我們自己為struct定義無參建構函式! 

作為一種良好的程式設計習慣,也為了避免不必要的誤解,還是建議直接使用book b=new book();這樣的方式來初始化struct變數!

對於其他值型別,c#給我們提供了更簡單的初始化語法,比如:

int i=0;

spring 解析初始化過程

1.xmlbeandefinitionreader 讀取解析檔案 解析encodedresource 編碼,校驗dtd,xsd,可以手動配置,沒有配置自動檢測,檢測方法有沒有doctype resolveentity 本地dtd 檔案頭 publicid systemid 忽略介面 beanname...

值初始化和預設初始化

引用 1 值初始化 顧名思義,就是用數值初始化變數。如果沒有給定乙個初始值,就會根據變數或類物件的型別提供乙個初始值。對於int型別其值初始化後的值為0。對於預設初始化內建型別變數來說 1 定義在函式體之外的變數是全域性變數,一般儲存在全域性區,儲存在全域性區的變數一般會執行值初始化。此時,其初始值...

型別初始化

最近兩天在看 net 本質論 其中提到了一型別初始化中比較關鍵的兩個方法 型別初始化器 cctor 和建構函式 ctor 建構函式不用多說,上學時就知道,但是型別初始化器我是剛剛知道,它是乙個無返回值 無引數 靜態的函式,在型別首次被載入時呼叫,接下來來看個例子 class class1 ctor ...