一、int?是什麼
二、了解nullable結構體
三、nullable型別的取值與轉換
1.getvalueordefault
2.運算子過載
一、int?是什麼
說到int?,或者double?,平時只是在接收資料庫傳來的可空值型別資料時用用。
但int既然是值型別,不能為空,為什麼int?就可空了呢,引用型別才是可空的,難道int?是引用型別?
測試一下吧:
1.寫一句int?=3,看看反編譯結果
2.編譯結果裡有關鍵字new,我們也new乙個試試
結果發現int?有兩個過載
過載1:
過載2:
過載2包含乙個int型引數,並解釋說會例項化乙個nullable結構體
3.手動例項化nullable
發現nullabletest=new nullable(1);這樣的寫法是可行的
下面是三種不同的寫法及其反編譯**:
可見,這三種寫法是等價的。
二、了解nullable結構體
nullable結構體長這樣:
但既然int? 是nullable結構體的特例,為什麼就可以賦值為null呢?
模仿上面的nullable自己封裝乙個nullable1並使用,看看效果
結果是nullable可以賦值為null,自己寫的nullable1卻不可以,而且nullable與nullable1兩個型別的顏色還有點深淺的區別,很奇怪
把錯誤的**遮蔽,反編譯看看il**,nullablee=null;對應的是這樣的
把nullablee=null; 改為nullablee=1;再看看結果:
再找乙個引用型別並賦值為null,比如string s=null; 的il**為:
可見對於nullablee=null;來說,null對應的il碼為initobj;而對於string s=null來說null對應的il碼則是idnull,這兩個地方的null是不同的
但我們不是也可以用e==null這樣的寫法嗎,難道這兒的null也是特殊的用法
繼續測試**,結果為true
反編譯
原來這兒的d==null相當於!d.hasvalue
hasvalue屬於nullable結構體的成員
對這一系列現象不清楚了,可能nullablee=null中的null用來特指nullable結構體中value為空時的狀態吧,懇請大神指教
三、nullable型別的取值與轉換
最後再試試nullable結構體中的兩個getvalueordefault方法以及兩個運算子過載
1. getvalueordefault
對於為空的變數,getvalueordefault()會返回0;getvalueordefault(t defaultvalue)則會返回指定的defaultvalue的值。
另外,c# 7.0的新語法「??」與這個方法有相同的作用
2.運算子過載
顯式運算子過載:
隱式運算子過載:
顯式過載的引數為可空值型別,返回結果為nullable結構體的value屬性;
隱式過載的引數為普通值型別,返回結果為乙個nullable結構體,同時其value屬性已經被賦值
比如,有兩個引數a、b
int a;
int? b=0;
將b賦值給a,會使用顯式過載,要寫成a = (int)b;
而將a賦值給b,則會使用隱式過載,可直接b = a;
apply call詳細了解
function thisobj argarray call 方法 function call thisobj arg1 arg2.定義 call 呼叫乙個物件的乙個方法,用另乙個物件替換當前物件。例 b.call a,args1,args2 a物件應用b物件的方法 他們都是用來代替另乙個物件呼叫乙...
詳細了解 Cookie Session Token
很久很久以前,web基本上就是文件的瀏覽而已,既然是瀏覽,作為伺服器 不需要記錄誰在某一段時間裡都瀏覽了什麼文件。每次請求都是乙個新的http協議,就是請求加響應,尤其不用記住是誰則剛發了http請求,每個請求相對來說都是全新的。也就是說必須把每個人區分開,這是乙個不小的挑戰,因為http請求是無狀...
詳細了解try catch return
情況1 try中有return,finally中沒有return public class trytest private static inttest catch exception e finally system.out.println finally return num 輸出結果如下 tr...