iT邦幫忙

0

在 C# 中 Nullable Reference Types 使用屬性MemberNotNull

c#
  • 分享至 

  • xImage
  •  

承上文 在 C# 中 Nullable Reference Types 使用屬性NotNullIfNotNull

我們繼續探討...


使用屬性 MemberNotNull

假設一個例子

class Person
{
  private string _name;

  public Person()
  {
    SetDefaultName();
  }

  private void SetDefaultName()
  {
    _name = "Bob";
  }
}

這段程式碼定義了一個名為 Person 的類別,裡面有一個私有欄位叫做 _name,以及一個私有函式叫做 SetDefaultName
類別裡還有一個無參數的建構子,裡面呼叫了 SetDefaultName 函式。
SetDefaultName 函式將 _name 這個欄位初始化為 "Bob"。

編譯器將對上面的程式碼發出警告:
https://ithelp.ithome.com.tw/upload/images/20230106/20152569ns8HhbcsaZ.jpg

警告訊息如下:

警告	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


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言