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;
}
}