承上文 在 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"。
编译器将对上面的程式码发出警告:
警告讯息如下:
警告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