承上文 在 C# 中 Nullable Reference Types 使用屬性NotNullIfNotNull
我們繼續探討...
假設一個例子
class Person
{
private string _name;
public Person()
{
SetDefaultName();
}
private void SetDefaultName()
{
_name = "Bob";
}
}
這段程式碼定義了一個名為 Person 的類別,裡面有一個私有欄位叫做 _name
,以及一個私有函式叫做 SetDefaultName
。
類別裡還有一個無參數的建構子,裡面呼叫了 SetDefaultName
函式。SetDefaultName
函式將 _name
這個欄位初始化為 "Bob"。
編譯器將對上面的程式碼發出警告:
警告訊息如下:
警告 CS8618 退出建構函式時,不可為 Null 的 欄位 '_name' 必須包含非 Null 值。請考慮將 欄位 宣告為可為 Null。
我們可以考慮把宣告欄位_name
改為可空'?',但是,明明建構子內就有呼叫 SetDefaultName 函式來初始化類_name
欄位,這意味著編譯器的訊息是錯誤的。
所以在這種情況下,與其把宣告欄位 _name
改為可空 '?',但你並不希望該欄位可空,更適合的作法應該是加入屬性 MemberNotNull 來解決這個問題:
[MemberNotNull(nameof(_name))]
private void SetDefaultName()
這是什麽意思呢?
[MemberNotNull(nameof(_name))]
屬性是給編譯器使用的,主要是讓編譯器更瞭解代碼的邏輯。
如果你使用了 [MemberNotNull(nameof(_name))]
屬性,
那麼編譯器就會知道在 SetDefaultName 方法中初始化的 _name
將不會是 null,因此它將不再發出警告。
了解更多:MemberNotNullAttribute Class
下一篇
在 C# 中 Nullable Reference Types 使用屬性MemberNotNullWhen