在这种特定情况下,为什么即使代码被执行,静态构造函数中的断点也不会被命中?

问题描述 投票:0回答:1

这是 Visual Studio 中一个简单的可重现的解决方案。 类库项目有一个 Customer 类,如下所示。 一个测试项目有一个测试类和方法,如下所示。 Customer 静态构造函数中有一个断点。 TestMethod1 中的第一个语句有另一个断点。

当我在调试模式下运行 TestMethod1 时,它的断点会按预期命中。但是,当我多次按 F11 或继续运行时,构造函数中的断点不会被命中,调试器也不会进入构造函数。构造函数代码运行,因为 TestMethod1 中的 name 变量的值为“John”。

如果我删除 TestMethod1 中的断点,构造函数中的断点就会被命中。

我不理解这种行为。我是否遗漏了什么或者这是调试器中的错误? 使用 VS 2022 Pro 17.7.4。

namespace SomeLibrary
{
    public  class Customer
    {
        public static readonly Customer SomeCustomer;
        public static string name;
        
        
        private Customer()
        {
            }

        static Customer()
        {
            SomeCustomer = new Customer();
            name = "John";
        }

        public static void SomeMethod()
        {
            
        }
    }
}

using SomeLibrary;

namespace TestProject1
{
    [TestClass]
    public class UnitTest1
    {
        
        [TestMethod]
        public void TestMethod1()
        {
            
            Customer.SomeCustomer.ToString();
            Customer.SomeMethod();

            string name = Customer.name;

        }
    }
}
c# visual-studio-2022 visual-studio-debugging
1个回答
0
投票

您是否在调试器的 Watch 选项卡中添加了 Customer 的任何内容?

在我的例子中,如果我观察

Customer
的任何元素(即 Customer.SomeCustomer)并在 TestMethod1 处设置断点,则静态构造函数内的断点不会被命中。

我认为这是因为 VS Debugger 在 TestMethod1 调用之前执行

Customer constructor
。由于
Customer constructor
是静态构造函数,最多只能调用一次,并且由 VS Debugger Process 调用,因此不会命中断点

如果关闭 TestMethod1 处的断点,VS 调试器将无法访问监视值,可以命中“客户构造函数”处的断点

© www.soinside.com 2019 - 2024. All rights reserved.