C#類和對象(六)——可空類型

    引用類型(類)的變量可以爲空,而值類型(結構)的變量不能。在一些情況下,這可能是一個問題,如把C#類型映射到數據庫或XML類型。數據庫或XML數量可以爲空,而int或double不能爲空。

    處理這個衝突的一個方法是使用映射到數據庫數字類型的類(這由Java實現)。使用引用類型,映射到允許空值的數據庫數字,有一個重要的缺點:它帶來了額外的開銷。對於引用類型,需要垃圾收集器進行清理。值類型不需要用垃圾收集器清理;變量超出作用域時,從內存中刪除。

       C#有一個解決方案:可空類型。可空類型是可以爲空的值類型。可空類型只需要在類型的後面添加“?”(它必須是結構)。與基本結構相比,值類型唯一的開銷是一個可以確定它是否爲空的布爾成員。

    在下面的代碼片段中,x1是一個普通的int,x2是一個可以爲空的int。因爲x2是可以爲空的int,所以可以把null分配給x2:

int x1 = 1;

int? x2 = null;

    因爲int值可以分配給int?,所以給int?傳遞一個int變量總是會成功,編譯器會接受它:

int? x3=x1;

    反過來是不正確的。int?不能直接分配給int。這可能失敗,因此需要一個類型轉換:

Int x4=(int)x3;

    當然,如果x3是null,類型轉換操作就會生成一個異常。更好的方法是使用可空類型的HasValue和Value屬性。HasValue返回true或false,這取決於可空類型是否有值,Value返回底層的值。使用條件操作符填充x5,不會拋出異常。如果x3是null,HasValue就返回false,這裏給變量x5提供-1:

int x5 = x3. HasValue ? x3. Value : -1;

       使用合併操作符(??),可空類型可以使用較短的語法。如果x3是null,則用變量x6給它設置-1,否則提取x3的值:

int x6 = x3 ?? -1;

注意: 對於可空類型,可以使用能用於基本類型的所有可用操作符,例如,可用於int?的+、-、*、/等。每個結構類型都可以使用可空類型,而不僅是預定義的C#類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章