在c#中,宣告乙個值型別或引用型別的變數,無論是否給這個變數賦初值,該變數都有預設值:
比如宣告引用型別變數: string a,其等效於string a = null,string的預設值為null。
比如宣告值型別變數:int a, 其等效於int a = 0,int的預設值為0。
為什麼需要讓值型別可以為null?
來看需要讓值型別為null的場景:
在資料庫中,通常值型別允許為null,比如int, decimal, datetime型別允許為null,而如果c#中對應的值型別不能為null,在儲存資料到資料庫的時候就會造成資料型別的不一致。
又比如,在搜尋的場景中,服務端宣告乙個變數,用來接收來自客戶端的、某個欄位的值,如果c#中不允許這個變數為null,但從客戶端傳來的字段值有可能為null(沒有選擇某個搜尋條件),這樣也造成了前後端資料型別的不一致。
為了應對這些場景,c#提供了允許讓值型別為null的語法。
允許值型別為null的寫法
datetime? date = null; 等效於: nullabledate = null;
int? a = null; 等效於:nullablea = null;
如何避免因值型別為null而丟擲異常?
通過if...else語句
intresult;
if(a == null
)else
通過??
int result = a ?? 0;
C 中,為什麼在值型別後面加問號
在c 中,宣告乙個值型別或引用型別的變數,無論是否給這個變數賦初值,該變數都有預設值 比如宣告引用型別變數 string a,其等效於string a null,string的預設值為null。比如宣告值型別變數 int a,其等效於int a 0,int的預設值為0。為什麼需要讓值型別可以為nul...
C 函式的引數型別中為什麼要加const
const 是用於對常量的修改,帶有const的引用可以稱之為常量引用。但是在函式中為什麼要新增這個呢,比如void fun string 和void fun const string 到底有什麼區別呢,本文就些問題進行簡單介紹。給定給以下兩個函式 void fun1 string s void f...
C 值型別為什麼不能為空null
參考部落格 shyleoking 首先我們知道值型別儲存在棧 stack 中,而引用型別儲存在堆 heap 中,棧的工作方式是先進後出,會保證先分配記憶體的變數後釋放。這樣就保證了棧中先進後出的規則不與變數的生命週期起衝突。在c 中,對變數的宣告要求是先定義後使用,變數的生命週期是從其定義開始直到程...