変数を別の変数に入れたときに問題は起きた
まずは以下のコードを見ていただきたい。
よくあるシングルトンパターンの手法で作成したインスタンスである
public class User{
private static User instance = null;
public static User Instance{
get{
if(instance == null){
instance = new User();
}
return instance;
}
}
こちらのInstance変数を他クラス、GameManager.csなどから参照するときに、
User.Instance
ってめんどいかもと思った私は、以下のように変数を変数に代入した。
public class GameManager{
private User user = User.Instance;
}
これでuserという短い変数名で呼び出せて簡単だね、と思っていた私。
参照型だからUser.Instanceに何か変更があっても見に行けるはずと思っていたが、
User.Instance = nulll
を行っても、GameManager.userの値はnullにならなかった。
おそらくここで起きているのは、
- 実行時にGameManager.userにUser.Instanceの参照先が渡された。
- User.InstanceをNULLにしたときにUser.Instanceの参照がどこも参照していないという状態になった
- GameManger.userには参照先が残ったまま
になっているのが原因と考えられる。
以下の記事を参考にさせていただきました。「++c++;未確認飛行 C」様より
https://ufcpp.net/study/csharp/oo_reference.html#:~:text=C%23%20
参照型の場合、「実体はどこか別の場所にあって、変数はそれを参照しているだけ」という状態になっています。 そして、元々の意味での null は「どこも参照していない」ということを表しています。
解決策
毎回、User.Instanceの参照先を取得するようにするか、
public class GameManager{
private User user => User.Instance;
}
もしくは
GameaManger.userへの変数の代入をやめておとなしくUser.Instanceを呼び出すかが簡潔な修正かなと
まとめ
参照型の値をNULLにしても参照先を失うだけで、参照型の参照先のデータがNULLになるわけではない。
参照型変数のむやみな代入はやめよう。
という教訓を得ました。