iT邦幫忙

0

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

c#
  • 分享至 

  • xImage
  •  

使用一個?符號表達 Nullable Reference

直接看個C# 例子:

string? str = null;

當加上 '?' 變數 str 可為 null,且編譯器不會為此發出警告


Example:

object? GetPotentialNull(bool flag)
{
  return flag ? null : new object();
}

void Foo()
{
  object obj = GetPotentialNull(false);
}

上述程式碼因為GetPotentialNull(false) 寫死代入false,
obj 永遠不會為 null,但編譯器並不能理解這點,還是會發出警告。

您可以通過以下方式抑制警告:

object obj = GetPotentialNull(false)!;

當加上 '!' 運算符,我們向編譯器“解釋”該方法絕對不會返回 null。
因此,此行程式碼片段將不會發出警告。


使用 attributes

舉個例子:

public string Name
{
  get => _name;
  set => _name = value ?? "defaultName";
}

private string _name;

如果將 null 值寫入 Name,編譯器將發出警告:

警告	CS8618	退出建構函式時,不可為 Null 的 欄位 '_name' 必須包含非 Null 值。請考慮將 欄位 宣告為可為 Null。

如果 _name的宣告類型 直接加上 '?' 符號表達可 Nullable Reference,如下:

private string? _name;

此時,編譯器將發出警告:

警告	CS8603	可能有 Null 參考傳回。	ClassLibrary1	

此時
存取器 get => _name 可以返回 null(這是一個錯誤,因為string Name不可為null)
存取器 set => _name 可以接受 null(這是正確的)

https://ithelp.ithome.com.tw/upload/images/20230104/20152569aBidIgjoen.jpg

這時候該怎麼做呢?

public string Name
{
  get => _name;
  set => _name = value ?? "defaultName";
}

[AllowNull]
private string _name;

_name加入屬性AllowNull,編譯器將假定 _name 可能被分配為 null,儘管類型並未標記為'?',如果將此property的值分配給應該永遠不是 null 的變數,編譯器不會發出警告。

了解更多:AllowNullAttribute Class


下一篇
在 C# 中 Nullable Reference Types 使用屬性NotNullWhen


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

尚未有邦友留言

立即登入留言