0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

参照型とNULL代入について

Last updated at Posted at 2023-08-15

変数を別の変数に入れたときに問題は起きた

まずは以下のコードを見ていただきたい。
よくあるシングルトンパターンの手法で作成したインスタンスである

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にならなかった。

おそらくここで起きているのは、

  1. 実行時にGameManager.userにUser.Instanceの参照先が渡された。
  2. User.InstanceをNULLにしたときにUser.Instanceの参照がどこも参照していないという状態になった
  3. 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になるわけではない。
参照型変数のむやみな代入はやめよう。
という教訓を得ました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?