0

Visual Studio の条件付きブレークポイントの「条件付き」が何を意味するのかわかりません。多分誰かが次の動作を説明できますか?

条件付きブレークポイントを設定する (ポップアップで [Is true] を選択する) 場合、"if" ステートメント内の式と同じように動作することを期待しています。

例えば:

    int x = 1;
    // (1) Breakpoint with expression "x == 1" returns True and the debugger stops here
    // (2) Breakpoint with expression "x != 1" returns False and the debugger does not stop here
    // (3) Breakpoint with expression "x = 42" returns ?? and the debugger stops here (!!) and executes the assignment(!!)

ケース (3) は明らかにタイプミスです。式(3)をif文に入れると

    if (x = 42) { /* ... */ }

コードはコンパイルされません。

(3) のタイプミスは危険です。この問題を示す簡単なデモを GitHubに配置しました。

この件に関する MSDN ドキュメントを読むとき、これは起こらないはずですよね?

ご指摘ありがとうございます。

更新: GitHub のコード

    using System;
    using System.Collections.Generic;
    using System.Linq;

    namespace ConsoleApplication1
    {
        /// <summary>
        /// Simple program showing that Visual Studio's conditional breakpoints do not have to return boolean results.
        /// 
        /// Tested with:
        /// - Visual Studio 2005
        /// - Visual Studio 2010
        /// </summary>
        public class Program
        {
            static void Main(string[] args)
            {
                var userService = new UserService();

                var userJon = new User {Id = 1, Name = "Jon Doe"};
                userService.SaveOrUpdateUser(userJon);

                var userSally = new User { Id = 2, Name = "Sally Sample" };
                userService.SaveOrUpdateUser(userSally);

                foreach (var user in userService.Users) {

                    // IMPORTANT: Add a conditional breakpoint on the next line with 'user.id = 1' (instead of 'user.id == 1' or 'user.id.Equals(1)'). See doc folder for screenshots.
                    int id = user.Id;

                    // ...some logic...

                    user.Id = id;

                    // ...some more logic...

                    userService.SaveOrUpdateUser(user);
                }

                // Show results of what just happened on command line
                Console.WriteLine("\n\nRESULTS==================================");
                foreach (var user in userService.Users) {
                    Console.WriteLine("User Id: " + user.Id);
                    Console.WriteLine("User Name: " + user.Name);
                }
                Console.WriteLine("\n\nEND RESULTS==================================");

                // Add a 'normal' breakpoint on the next line to read the console output
            }

        }

        internal class UserService
        {
            public UserService()
            {
                Users = new List<User>();
            }

            public List<User> Users { get; private set; }

            /// <summary>
            /// Imagine this method doing a database insert or update!
            /// </summary>
            public void SaveOrUpdateUser(User user)
            {
                Console.WriteLine("\tSaveOrUpdateUser...");
                Console.WriteLine("\tUser Id: " + user.Id);
                Console.WriteLine("\tUser Name: " + user.Name);

                User userAlreadyPresent = Users.FirstOrDefault(u => u.Name.Equals(user.Name)); // dummy find method

                if (userAlreadyPresent == null) {
                    Console.WriteLine("Adding new user");

                    Users.Add(user);    
                }
                else {
                    Console.WriteLine("\nUPDATING USER.......................");
                    Console.WriteLine("\tOld infos about user:");
                    Console.WriteLine("\tUser id: " + userAlreadyPresent.Id);
                    Console.WriteLine("\tUser name: " + userAlreadyPresent.Name);
                    Console.WriteLine("\tNew infos about user:");
                    Console.WriteLine("\tUser id: " + user.Id);
                    Console.WriteLine("\tUser name: " + user.Name);

                    userAlreadyPresent.Id = user.Id;
                }
            }
        }

        internal class User
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
    }
4

1 に答える 1

1

デバッガーは、プログラムのデバッグに使用されます。これらのプログラムは、任意の数の言語で作成できます。F#、C#、VB、アセンブリ、C++、C など。これらの各言語には、式を true かどうかを評価する機能のセマンティクスが異なります。デバッガーは、特定の言語に固有のことは何もしません (実際、おそらく、ブレークポイントを取得する特定のコードが特定の言語で書かれていることさえ知りません)。物事がメモリ内のどこにあり、それが何を表しているかを本当に知っているだけです。

簡単に言えば、条件付きブレークポイントの式を評価するときに、C# 構文に準拠していません。

于 2012-09-09T18:22:12.733 に答える