總結一下c#中問號有三種
第一:三目操作運算子【 ? : 】
問號前面的是條件,後面的是結果,條件滿足返回冒號前面的值否則後面的值
事例[csharp]
view plain
copy
"white-space:pre"
>
public
intwhobig(
inta,
intb)
public
intwhosmall(
inta,
intb)
第二:基本資料型別可空識別符號【?】
宣告的變數可以為空,比如int,string,但是布林值為空依然報錯
事例[csharp]
view plain
copy
"white-space:pre"
>
inti =
null
;//報錯
bool
j =
null
; //報錯
int? k =
null
;//通過
bool
? m =
null
; //報錯
第三:null合併運算子【??】
賦值的結果中的變數如果為空則用??後面的值替代前面的變數,否則直接用前面的變數
如果此運算子的左運算元不為 null,則此運算子將返回左運算元;否則返回右運算元
事例[csharp]
view plain
copy
"white-space:pre"
>
public
string
hongyan(
string
a)
如果a為空就選擇??後面的值否則前面的值
第四:null條件運算子【?.】
用於在執行成員訪問 (?.) 或索引 (?[) 操作之前,測試是否存在 null。 這些運算子可幫助編寫更少的**來處理 null 檢查,尤其是對於下降到資料結構。
[csharp]
view plain
copy
int? length = customers?.length;
// null if customers is null
customer first = customers?[0]; // null if customers is null
int? count = customers?[0]?.orders?.count();
// null if customers, the first customer, or orders is null
最後乙個示例演示 null 條件運算子會短路。 如果條件成員訪問和索引操作鏈中的某個操作返回 null,則該鏈其餘部分的執行將停止。 表示式中優先順序較低的其他操作將繼續。 例如,以下的示例中的 e 將始終執行,?? 和 == 操作將執行。
[csharp]
view plain
copy
a?.b?.c?[0] ?? e
a?.b?.c?[0] == e
null 條件成員訪問的另乙個用途是使用非常少的**以執行緒安全的方式呼叫委託。 舊方法需要如下所示的**:
[csharp]
view plain
copy
var handler =
this
.propertychanged;
if(handler !=
null
) handler(…)
新的方法是要簡單得多:
[csharp]
view plain
copy
propertychanged?.invoke(e)
新方法是執行緒安全的,因為編譯器生成**以評估 propertychanged(僅一次),從而使結果保持在臨時變數中。
你需要顯式呼叫 invoke 方法,因為不存在 null 條件委託呼叫語法 propertychanged?(e)。 有太多不明確的分析情況來允許它。
C 中的問號運算子
c 中的問號運算子分為三種功能 第一種 單問號作為條件判斷的三元運算子。這種方式可以處理一些簡單的if結構的條件語句,比如簡單的根據條件結果賦值的功能 inta 4 intb 4 intc b 0?b a 上面的 實現了如果變數b的值大於0,則將b的值賦給c,否則將a的值賦給c。第二種 單問號做為基...
c 小技巧 單問號和雙問號 位運算子
作用 用於給變數設初化的時候,給變數 int型別 賦為null值,而不是0。例子 public int a 預設值為0 public int b 預設值為null 參考 作用 用於判斷並賦值,先判斷當前變數是否為null,如果是就可以賦乙個新值,否則跳過。例子 public int?b 預設值為nu...
C 運算子 各種問號的用法和說明
1 可空型別修飾符 引用型別可以使用空引用表示乙個不存在的值,而值型別通常不能表示為空,例如 string str null 是正確的。int i null 編譯器將報錯。為了使值型別也可為空,可空型別出現了,可空型別使用可空型別修飾符?來表示,表現形式為t?例 int?表示是可空的整形,datet...