この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());
}
}