詳細了解 int 型別

2021-07-30 12:29:09 字數 2582 閱讀 9204

一、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...