Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 奇怪的行为:立即启动应用程序窗口,而不是计算表达式_Visual Studio - Fatal编程技术网

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中见过一些奇怪的东西,但我认为这是最奇怪的事情之一。有人知道那里发生了什么吗?:)

在不调试的情况下,在即时窗口中计算表达式时,将执行以下过程

  • 将项目/应用程序二进制文件加载到宿主进程中
  • 以静默方式将调试器附加到宿主进程
  • 针对该调试器会话计算表达式
大多数情况下,这样做的方式很难检测到应用程序是否正在实际运行。但偶尔应用程序的副作用会显现出来,并揭示出引擎盖下到底发生了什么

编辑

一般来说,它不应该显示UI。我可以想到一些不太清楚的例子,在这些例子中,这种情况会发生,而不是VisualStudio的bug。不过,基本上所有的问题都归结为相同的情况

经过计算的字符串会导致意外的副作用发生在正常程序流中不会发生的时间

这实际上比您在即时窗口中预期的更常见,因为它实际上是在无序地执行代码。通常,在执行
Program.Main
之前,您永远无法访问
newmercury\u Reports
,但在即时窗口中,这正是发生的情况。这可能会产生恶劣的影响,比如重新排序静态类型构造函数

下面是一些意外的结果,它们可以通过即时窗口表达式显现出来

  • 导致加载类型,从而导致其静态初始值设定项运行
  • 更改静态初始值设定项的运行顺序
  • 表达式的返回类型具有调试器执行的
    ToString
    方法
  • 表达式的返回类型具有调试器执行的
    DebuggerDisplay
在过去,我见过静态构造函数案例导致UI显示。本质上,静态类型构造函数正在计算
MainForm.Instance
(一个惰性创建属性)。在正常的程序流程中,它是从
程序调用的。Main
运行,从那时起就可以使用。在即时窗口中,虽然
Program.Main
没有运行。但是正在执行的表达式无意中加载了该类型,因此显示了一个微不足道的属性getter的UI


不过,这是一个相当模糊的角落案例。我认为最有可能的原因是VisualStudio中的一个bug。调试是一件令人讨厌的事情,尤其是在执行实时代码时,这可能就是一种症状

是,但它不应该开始执行Main()中的代码。另外,请注意,我提到它在启动应用程序时从未实际计算过我的表达式。绝对奇怪。@BrandonMoore你是如何确定它执行了
Main
函数,还是其他导致UI显示的东西?哈哈,我就知道你下一步会问我这个问题。我想我无法想象如果不执行一行显示表单的代码,表单将如何显示。在我的项目中,唯一一行可以这样做的是Main()。而且,直到我在Main()过程中放置断点,它才开始正常工作。我们只能从中做出推断,但事实上,仅仅添加一个断点就导致它开始正常工作,这一事实非常有力地表明,某些东西没有按照Visual Studio的方式工作。@BrandonMoore更新了我的答案,详细说明了这可能实际发生的疯狂情况。很可能您在Visual Studio中看到了一个bug