關於C#中的“?”

来源:https://www.cnblogs.com/shanzhiming/archive/2019/08/23/11402803.html

shanzm 2019年8月23日 19:59:46 [TOC] 1. 可空類型修飾符(T?) 強類型語言中引用類型可以為空,如: 而你若是定義一個值類型為空,則是會報錯的。 然而,在處理資料庫和其他包含可能未賦值的元素的數據類型時,我們希望可以將 null 賦值給數值類型或布爾型的功能特別有用。例 ...


shanzm-2019年8月23日 19:59:46

1. 可空類型修飾符(T?)

強類型語言中引用類型可以為空,如:string str=null;
而你若是定義一個值類型為空,則是會報錯的。

然而,在處理資料庫和其他包含可能未賦值的元素的數據類型時,我們希望可以將 null 賦值給數值類型或布爾型的功能特別有用。例如,資料庫中的布爾型欄位可以存儲值 true 或 false,或者,該欄位也可以未定義

所以C# 提供了一個特殊的數據類型,Nullable 類型(可空類型),可空類型可以表示其基礎值類型正常範圍內的值,和 null 值。

例如,Nullable< Int32 >,讀作"可空的 Int32",可以被賦值為 -2^31 到2^31-1 之間的任意值,也可以被賦值為 null 值。

類似的,Nullable< bool > 變數可以被賦值為 true 或 false 或 null。

實際上,Nullable類型是一個結構體,它有兩個公開可讀欄位:HasValue和Value。 HasValue是一個布爾值,當有值存儲時它為真,當變數值為null時HasValue為假。當HavValue為真是時,可以取得變數的值;為假時,當嘗試取得變數的值時會拋出一個異常(System.InvalidOperationException)。

聲明一個 nullable 類型(可空類型)的語法如下:
用可空類型修飾符"?"來表示,
表現形式為"T?"

例如:int? 表示可空的整形,DateTime? 表示可為空的時間。
T? 其實是System.Nullable(泛型結構)的縮寫形式,也就意味著當你用到T?時編譯器編譯 時會把T?編譯成System.Nullable的形式。

例如:int?,編譯後便是System.Nullable的形式。

2. 三元(運算符)表達式(?: )

例如:x?y:z 表示如果表達式x為true,則返回y;如果x為false,則返回z,是省略if{}else{}的簡單形式。

3. 空合併運算符(??)

為了減少可空類型的代碼量,遇到null的時候,C#提供了??操作符來獲取如果為空的預設值

如果此運算符的左操作數不為null,則此運算符將返回左操作數,否則返回右操作數。

例如:a??b 當a為null時則返回b,a不為null時則返回a本身。

空合併運算符為右結合運算符,即操作時從右向左進行組合的。如,“a??b??c”的形式按“a??(b??c)”計算。

4. NULL檢查運算符(?.)

?.用於判斷某個對象是否為空,如果對象為NULL,則不進行後面的獲取成員的運算,直接返回NULL

例如:

class Foo
{
public int N { get; } = 1;
}
 static void Main(string[] args)
{
    Foo foo = null;
    var n = 2 + foo?.N ?? 1
    Console.WriteLine(n);
    Console.ReadKey();//input :1
}

說明:

  1. +運算和??運算,是同級的,從左到右
  2. foo?N 其中foo為空,故foo?.N為空,而不是我們自己定義只讀屬性N的預設值1
  3. 2+null,註意結果是int?類型的,結果是null
  4. null??1,結果即1

您的分享是我們最大的動力!

更多相關文章
一周排行
  • 一、背景 代碼實例:https://gitee.com/D_C_L/CurtainEtcAOP.git我們實際系統中有很多操作,是不管做多少次,都應該產生一樣的效果或返回一樣的結果。 例如: 1. 前端重覆提交選中的數據,應該後臺只產生對應這個數據的一個反應結果。 2. 我們發起一筆付款請求,應該只 ...
  • 關鍵字:流程未來節點處理人 工作流快速開發平臺 工作流流設計 業務流程管理 asp.net 開源工作流 業務背景:一個流程在啟動起來後,是可以對一些節點計算出來處理人是誰,流程的走向。對於另外一些節點處理人有可能需要相關的人員調整的。在一些審批的環境下,需要把能夠計算出來的節點處理人在發起時計算出來... ...
  • 簡述 我們做軟體工作的雖然每天都離不開網路,可網路協議細節卻不是每個人都會接觸和深入瞭解。我今天就來和大家一起學習下Socket,並寫一個簡單的聊天程式。 一些基礎類 首先我們每天打開瀏覽器訪問網頁信息都是使用的HTTP/HTTPS協議,而HTTP是通過的TCP建立的連接。TCP底層又是通過的Soc ...
  • 點這裡進入ABP進階教程目錄 在功能按鈕區增加一個自定義按鈕 - Add(創建課程) 添加按鈕 打開展示層(即JD.CRS.Web.Mvc)的\wwwroot\view-resources\Views\Course\Index.js //用以存放Course查詢相關腳本 自帶按鈕已有五個我們再添加一 ...
  • 點這裡進入ABP進階教程目錄 我們嘗試在新增/編輯界面增加一個下拉框用來代替輸入框編輯Status 添加實體 打開領域層(即JD.CRS.Core)的Entitys目錄 //用以存放實體對象添加一個類StatusCode.cs //狀態信息 更新模型 更新查詢視圖模型 打開展示層(即JD.CRS.W ...
  • 在項目視圖中,找到-》輸出 視窗,在視窗中選擇ASP.NET Core Web伺服器,調試項目即可看到執行的sql語句 ...
  • 前言: 通過Fiddler抓取瀏覽器請求數據,相信大家已經都會用了,我們知道Fiddler是通過在本機計算器添加一個預設的代理伺服器來實現的抓包數據的,埠號為:8888。 其實當我們打開Fiddler的設置也可以看到: 然後查看本地計算器的網路代理設置: 基於上面的原理,Fiddler就實現了經過 ...
  • 場景 Winform控制項-DevExpress18下載安裝註冊以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100061243 在上面已經實現DevExpress的安裝之後,拖拽一個TreeList,然後怎樣給 ...
  • 場景 Winform控制項-DevExpress18下載安裝註冊以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100061243 DevExpress的TreeList怎樣設置數據源,從實例入手: https:/ ...
  • 場景 在開發中,經常會有一些全局作用域的常量、欄位、屬性、方法等。 需要將這些設置為全局作用域保存且其實例唯一。 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 首先新建一 ...
x