簡便的空引數校驗 (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,因此它是乙個...