讀【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語法 |
有效值 | 有效值 |
|
null | 有效值 |
|
有效值 | null |
|
null | null |
|
4. 結論
如果變數有與資料表操作有關,該變數最好與資料表的欄位是否可為Null一致
github連結(Vs2015) : 點我下載