C 9 0 新特性預覽 空引數校驗

2021-10-13 02:59:58 字數 1594 閱讀 7942

簡便的空引數校驗 (simplified null argument checking)

目的這個特性主要是為了更簡便的檢查方法的引數是否為 null 並丟擲 argumentnullexceptiony 異常。

語法語法很簡單,在引數名後加個嘆號即可:

voidm(

string name!

)

以上**會被翻譯為:

voidm(

string name)..

.}

想必有些同學已經從上面**看出來了,這個生成的空校驗,只是校驗引數是否為 null,這也就意味著它無法在值型別上使用,以下**將報錯:

// error: 無法在值型別引數上使用!操作符

void

g<

t>

(t arg!

)where t :

struct

當然,可空的值型別是可以的,但是編譯器會提示一條警告,提示你在可空型別上進行了空檢查:

// warning: 將顯式null檢查與可為null的型別結合使用

voidm(

int? x!

)類似的,在引數擁有預設值的情況下,也會提示警告

// warning: 引數 'x' 進行了空檢查但是它預設為空

voidm(

string x!

=null

)

構造方法的場景

在構造方法的場景下,空引數校驗將發生在任何其他**的前面,包括:

對其他構造方法的鏈式呼叫,即 this() 或 base()

在構造方法內的隱式字段初始化

舉個例子:

classc}

以上**會大致翻譯為以下偽**:

class

c field =

getstring()

;:this

(name);.

..}

lambda 的場景

這個特性在 lambda 中也可以使用

void g()

不可以使用的場景

這個特性只能用於有方法體的方法中,也就意味著它不能用於抽象方法、介面、委託和部分方法。

以下**編譯器會報錯:

inte***ce

c

不能用於屬性。因為vb.net教程屬性 setter 中的 value 是隱式的,不會出現在引數列表中,所以此特性不適用於屬性。

string firstname! // error

不能用於 out / ref / in 的c#教程引數

public

voidm(

outstring x!

)// error

參考

[proposal: simplified null argument checking]

[unit test: nullcheckedparametertests.cs]

[ldm-2019-07-10.md]

C 的新特性 可空型別

隨著c 語言最新標準的出爐,現在它也提供了對可空型別的支援。這個小變化將會在處理那些包括可選項的資料庫記錄時非常有用。當然在其他地方,它也是非常有用的。簡單說來,可空資料型別就是包含了所定義的資料型別或者值的空 null 的型別。c 的ecma 334標準提供了對所有c 值型別的可空版本的描述。定義...

C 4 0 新特性之引數

c 4.0中新加了幾種引數,今天來了解一下 1.預設引數 c 4.0 現在對方法,構造器,以及索引器支援使用可預設的引數 當引數的預設值作為宣告的一部分被指定的時候,引數就是可預設的。static void changevalue intx,inty 3 int y 有乙個預設的引數3,因此它是乙個...

C 4 0 新特性之引數

c 4.0中新加了幾種引數,今天來了解一下 1.預設引數 c 4.0 現在對方法,構造器,以及索引器支援使用可預設的引數 當引數的預設值作為宣告的一部分被指定的時候,引數就是可預設的。static void changevalue intx,inty 3 int y 有乙個預設的引數3,因此它是乙個...