PR: CADDiではバックエンドエンジニア、フロントエンジニア、アルゴリズムエンジニア、SRE等などを募集しています。
MonoBehaviour
と null
の比較が特殊であることは周知の事実である。これは MonoBehaviour
の基底クラスである UnityEngine.Object
のメソッド Object.operator bool
、Object.operator ==
、そして Object.operator !=
に起因する。
operator bool
と null
との比較は同じ結果が得られるため、null
との比較においては operator ==
や operator !=
を使う意味はほぼ無い。
- Object-bool - Unity スクリプトリファレンス
- Object-operator != - Unity スクリプトリファレンス
- Object-operator == - Unity スクリプトリファレンス
たとえば、状態を常に正しい状態に保つためにプロパティの set
で単なる代入以外の処理を行っている場合、オブジェクトが本当に null
かどうかを確認してから代入したい場合がある。
SomeType someField;
SomeType SomeProperty {
get => someField;
set {
someField = value;
SomeMethod();
}
}
この様な場合、System.Object.ReferenceEquals
を用いることでオブジェクトが本当に null
か否かを確認することができる。
void UpdateSomeProperty() {
if (!System.Object.ReferenceEquals(null, SomeProperty) && !SomeProperty) {
SomeProperty = null;
}
}
System.Object.ReferenceEquals
は is null
や is object
で置き換えることで、更に簡便に記述することができる。
void UpdateSomeProperty() {
if (SomeProperty is object && !SomeProperty) {
SomeProperty = null;
}
}
null
であることを確認する場合は is null
を、null
でないことを確認する場合は is object
を用いる。
- Object.ReferenceEquals(Object, Object) メソッド (System) | Microsoft Docs
- is - C# リファレンス | Microsoft Docs
- Expressions - C# language specification | Microsoft Docs
- 型のテスト演算子とキャスト式 - C# リファレンス | Microsoft Docs
null
以外との比較には変わらず ReferenceEquals
が使える。
SomeType someField;
SomeType SomeProperty {
get => someField;
set {
if (ReferenceEquals(lockTarget, value)) {
return;
}
someField = value;
SomeMethod();
}
}
void UpdateSomeProperty() {
if (!SomeProperty) {
SomeProperty = null;
}
}