より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Visual Studioのステップイン中に表示されるダイアログ「ステップイン要求〜」

Visual Studioデバッグしていると以下のようなダイアログが表示されることがあります。

f:id:rimever:20190826223635p:plain

ステップイン要求により、プロパティまたは演算子の自動的なステップオーバーが発生しました。

この動作は、「関数にステップイン」を選択するか、または「プロパティおよび演算子をステップオーバーする」チェックボックスをオフすることによって実行される行のコンテキストメニューでオーバーライドできます。

今後も自動的なステップオーバーが発生したときに通知を受け取りますか?

言葉だけでは、理解不能で思考が凍結するのですが、プロパティや演算子は飛ばすという意味です。

    class Program
    {
        static void Main(string[] args)
        {
            Point p = new Point();
            if (p.X != 0)
            {
                Console.WriteLine("Hello World!");

            }
        }
    }
    public struct Point
    {
        public int X { set; get; }
        public int Y { set; get; }
    }

f:id:rimever:20190827064415p:plain

p.X != 0

というPointのXという名前のプロパティにアクセスしようとしたところで、ダイアログが表示されます。

Xというプロパティの中身(get)まではステップインしません。ということでダイアログが表示されています。

このダイアログ自体は、今後表示するかしないかだけですので、プロパティが飛ばされてますよというのを認識したら、Noで良いです。

これまで私はよくわかんないけどNoでいいやとしてましたが、それはそれで良いかと。

では、ステップオーバーしたくない場合は、

Visual Studioのオプションを開き、デバッグ-全般より、

「プロパティおよび演算子をステップオーバーする」のチェックを外します。

f:id:rimever:20190827065342p:plain

すると

f:id:rimever:20190827070546p:plain
getの宣言までステップインできる

私の環境では、プロパティ自体にブレークポイントが貼られていれば、「プロパティおよび演算子をステップオーバーする」にチェックが入っていてもいなくても、デバッガはそこで停止するようです。

基本はチェックしてステップオーバーしても支障がないかなと思われます。

が、以下のような複雑なプロパティもステップオーバーされてしまうので、注意です。

プロパティ内部での挙動を見落とす可能性もあります。

と言っても実際のデバッグをしているとプロパティはどちらかというとステップオーバーしたいところではあります。

    public struct Point
    {
        private int valueX;
        public int X {
            set
            {
                valueX = value;
            }
            get { return valueX; } }
        public int Y { set; get; }
    }