Visual studio 奇怪的行为:立即启动应用程序窗口,而不是计算表达式
我不知道下面的代码是否真的相关,但为了充分披露,这里是我试图从即时窗口调用的代码:Visual studio 奇怪的行为:立即启动应用程序窗口,而不是计算表达式,visual-studio,Visual Studio,我不知道下面的代码是否真的相关,但为了充分披露,这里是我试图从即时窗口调用的代码: abstract class Test { public int x; public Test() { x = 5; } } class TestImp : Test { public int GetX() { return this.x; } } 这只是一个测试,看看是自动调用默认的基本构造函数,还是因为记不起来而必
abstract class Test
{
public int x;
public Test()
{
x = 5;
}
}
class TestImp : Test
{
public int GetX()
{
return this.x;
}
}
这只是一个测试,看看是自动调用默认的基本构造函数,还是因为记不起来而必须专门调用它
好的,开始讨论这个问题。我在即时窗口中键入了以下内容以查看结果:
new Mercury_Reports.TestImp().GetX();
而不是计算表达式,它只是启动了我的应用程序。我关闭了应用程序,又尝试了两次,得到了相同的结果。下一次,我在Program.cs文件中设置了一个断点。然后,它决定只计算我的表达式,而不是像前三次那样启动应用程序,然后点击断点
我以前在VisualStudioIDE中见过一些奇怪的东西,但我认为这是最奇怪的事情之一。有人知道那里发生了什么吗?:) 在不调试的情况下,在即时窗口中计算表达式时,将执行以下过程
- 将项目/应用程序二进制文件加载到宿主进程中
- 以静默方式将调试器附加到宿主进程
- 针对该调试器会话计算表达式
Program.Main
之前,您永远无法访问newmercury\u Reports
,但在即时窗口中,这正是发生的情况。这可能会产生恶劣的影响,比如重新排序静态类型构造函数
下面是一些意外的结果,它们可以通过即时窗口表达式显现出来
- 导致加载类型,从而导致其静态初始值设定项运行
- 更改静态初始值设定项的运行顺序
- 表达式的返回类型具有调试器执行的
方法ToString
- 表达式的返回类型具有调试器执行的
值DebuggerDisplay
MainForm.Instance
(一个惰性创建属性)。在正常的程序流程中,它是从程序调用的。Main
运行,从那时起就可以使用。在即时窗口中,虽然Program.Main
没有运行。但是正在执行的表达式无意中加载了该类型,因此显示了一个微不足道的属性getter的UI
不过,这是一个相当模糊的角落案例。我认为最有可能的原因是VisualStudio中的一个bug。调试是一件令人讨厌的事情,尤其是在执行实时代码时,这可能就是一种症状 是,但它不应该开始执行Main()中的代码。另外,请注意,我提到它在启动应用程序时从未实际计算过我的表达式。绝对奇怪。@BrandonMoore你是如何确定它执行了
Main
函数,还是其他导致UI显示的东西?哈哈,我就知道你下一步会问我这个问题。我想我无法想象如果不执行一行显示表单的代码,表单将如何显示。在我的项目中,唯一一行可以这样做的是Main()。而且,直到我在Main()过程中放置断点,它才开始正常工作。我们只能从中做出推断,但事实上,仅仅添加一个断点就导致它开始正常工作,这一事实非常有力地表明,某些东西没有按照Visual Studio的方式工作。@BrandonMoore更新了我的答案,详细说明了这可能实际发生的疯狂情况。很可能您在Visual Studio中看到了一个bug