[C#] 005.使用 int? 來確保數值型別也可以為null (依照情境決定變數是否可為 nulllable <>)

讀【157個完美化C#的建議】一書的理解筆記 - 005

重點: 變數增加Nullable <>  變為可放null的變數

※ 可null變數為 .net FrameWork 2.0的產物

流程說明
1. nullable <>的用法說明
2. 考慮情境
3. 目前經歷所用
4. 結論

1. Nullable <>的用法說明

以int 型別為例,完整宣告如下:

Nullable<int> score = null;//完整定義

可為Null的型別變數 可以直接對型別變數存放值 (也叫隱式存值),但通常我們都用以下的寫法,

int? score = null;//語法糖,簡略定義
     int j = 0;
     score = j;//Nullable<int>  = int :可以這樣寫

但是Null變數 不可以將值傳給一般變數

int? score2 = 123;
int j2 = 0;
//j2 = score2; 該行出錯   ==> int = Nullable<int>  :不可以這樣寫

正確做法(簡化,null聯合運算子)   https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/operators/null-conditional-operator

j2 = score2 ?? 0;

實際上如下(條件運算子) https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/operators/conditional-operator

j2 = score2.HasValue == true ? 0 :j2;

更完整的就如下 

if (score2.HasValue == true)
{
        j2 = score2.Value;
}

2. 考慮情境

情境 理由
資料庫 資料表欄位為可Null
分散式系統

伺服器接收用戶端的資料,在傳輸過程中資料【遺失】或被【串改】,轉型失敗時視為Null,可避面系統異常

3. 目前經歷所用

當對資料表下Inline SQL語法時,如果資料表欄位有Null的型態,傳進來的參數此時為Null可以享受使用以下語法

優點: 可以不用寫條件式判斷,再去附加字串的Inline Sql

 SELECT * 
 FROM testDB as A
 AND (@_ID IS NULL OR A.ID = @_ID)
 AND (@_Name IS NULL OR A.Name = @_Name)

傳進的參數有 _ID 與 _Name 

傳進參數_ID

傳進參數_Name

實際SQL語法

有效值 有效值
 SELECT * 
 FROM testDB as A
 AND (A.ID = @_ID)
 AND (A.Name = @_Name)

 

null 有效值
 SELECT * 
 FROM testDB as A
 AND (true)
 AND (@_Name IS NULL OR A.Name = @_Name)

 

有效值 null
 SELECT * 
 FROM testDB as A
 AND (@_ID IS NULL OR A.ID = @_ID)
 AND (true)

 

null null
 SELECT * 
 FROM testDB as A
 AND (true)
 AND (true)

 

4. 結論

如果變數有與資料表操作有關,該變數最好與資料表的欄位是否可為Null一致

github連結(Vs2015) : 點我下載