2
2

More than 5 years have passed since last update.

暗黙のgetterなのかな?

Posted at

この2日悩んだ
ちゃんとこちらにもまとめておこう

■疑問点
 下記ソースにて
 aaa=1とDebug.Log("");にブレークポイントを設定し、
 MonoDevelopのwatcherにABCと入力したところ
 Debug.Log("
");にはブレークしないが
 ABCの値は更新される。

 aaa=1→aaa=5 までの間はgetterが呼ばれないので
 ABCの値は変動しないと思っていた、
 つまりaaa=5を通過した時点ではABCは0のままのはず。
 そして、Debug.Log("ABC=" + ABC.ToString()); の行にて
 初めてABCのgetterが動き、ABCの値が更新されると思っていました。

■検証
 aaa=1とDebug.Log("") に
 ブレイクポイントを貼り
 watcherにABCが存在する時は
 ステップオーバーしてメソッドの終わりまで進めたところ
 コンソールにログの
が6回分出力されていた。
 そしてDebug.Log("***") にはブレークしませんでした。

 つまりwatcherは表示するために
 getterをコールしているようですが、
 開発環境側でブレークしないように作られているのでは
 ないか?

 また、Debug.Log("ABC=" + ABC.ToString());に
 ブレークポイントを貼って実行した時は
 コンソールにログの*** が表示されるのは
 Debug.Log("ABC=" + ABC.ToString());をコールした
 1回だけ。
 これに関しても開発環境自身が
 呼び出したときはブレークしないように作られているではないか?

■結論
 ●プロパティ名のwatcherが存在する時は、
  ステップ実行すると内部的にgetterが動く。
  ステップ実行しない時はブレークポイントを
  セットしブレークした時点で内部的にgetterが動く。
  ただしどちらのケースもプロパティ側ではブレークポイントを
  セットしてもブレークできない。
  プロパティ側でブレークするのは明示的にgetterを
  読んだときのみ。

■ソース
public class NewBehaviourScript : MonoBehaviour {

private int aaa;

public int ABC{
get {
Debug.Log("***");
return aaa;}
}

// Use this for initialization
void Start () {
aaa = 1;
aaa = 2;
aaa = 3;
aaa = 4;
aaa = 5;
aaa = 6;
Debug.Log("ABC=" + ABC.ToString());
}

}

2
2
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
2
2