Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
C#范围和visual studio调试_C#_Visual Studio 2010_Debugging_Scope - Fatal编程技术网

C#范围和visual studio调试

C#范围和visual studio调试,c#,visual-studio-2010,debugging,scope,C#,Visual Studio 2010,Debugging,Scope,在用VS2010调试C#代码时,我测试了一些我无法解释的奇怪行为。 使用下面非常简化的代码: public void Go() { var test = new Random().Next(10) % 2 == 0; // Simulate various cases var qry = new[] { "bla", "ble", "bli", }.ToList(); // Get whole list //string

在用VS2010调试C#代码时,我测试了一些我无法解释的奇怪行为。 使用下面非常简化的代码:

public void Go()
    {
        var test = new Random().Next(10) % 2 == 0; // Simulate various cases

        var qry = new[] { "bla", "ble", "bli", }.ToList(); // Get whole list        

        //string myString; // If declare out of scope OK
        if (test) // BreakPoint here and dragNDrop on next line
        {
            var myString = "bli"; // declare and instanciate in scope => NullReferenceException 

            qry = qry.Where( item => item == myString ).ToList(); // filter the list
        }
    }
当我尝试在不使用鼠标测试测试值的情况下进入if范围时,myString不能在抛出NullReferenceException的情况下实例化。 为了得到一个“functional”代码,我只需要将myString声明在范围之外。 我不理解为什么VS不能让我通过if测试,如果有人能解释我这个奇怪的异常,我会很高兴。 谢谢

编辑: 在比较两个IL代码(取决于myString声明的位置)之后,我可以看到VS“不能”在生成的隐藏类上执行指令newobj,并且字符串值的赋值是在null值上进行的。在“超出范围”声明版本中,newobj指令从方法的开头开始执行

ILCode(检查范围):

IL\u 0041:brtrue.s IL\u 006e//if(测试)
IL_0043:newobj实例void ConsoleApplication5.BreakPointTest/'c_udisplayClass1':.ctor()
IL_0048:stloc.2
IL_0049:没有
IL_004a:ldloc.2
ILU 004b:ldstr“bli”
IL_0050:stfld字符串控制台应用程序5.BreakPointTest/'c__DisplayClass1'::myString

我认为指针的跳转在nop/ldloc.2指令上完成,并且“忘记”c__DisplayClass1的实例。

这看起来像是一个调试器问题。但是请注意,生成的代码与您编写的代码完全不同。您正在lambda表达式中使用myString,因此编译器创建了一个隐藏类来存储对myString的引用。拖动指令指针时,可能会跳过此类的必要初始化,因为它们不在源代码中表示


作为一个想法,尝试将指令指针拖动到“if”之后的左括号中。

是否有可能在释放模式下构建?在发布模式下的编译器优化可能会对代码造成一些影响,使调试体验与代码中的内容有点不一致。我尝试了该代码(在调试器下),对我来说,这两种方式都很好。移动指令指针也能起作用?对不起,这是我的第一个问题…(回车键…)。我是在调试模式下构建的,没有优化,当我拖动到打开的括号中时:结果相同@Alex:您应该有权初始化表示lambda的隐藏类。我会朝这个方向搜索,因为我不太了解这个秘密。
IL_0041:  brtrue.s   IL_006e  // if (test)
IL_0043:  newobj     instance void ConsoleApplication5.BreakPointTest/'<>c__DisplayClass1'::.ctor()
IL_0048:  stloc.2
IL_0049:  nop
IL_004a:  ldloc.2    
IL_004b:  ldstr      "bli"
IL_0050:  stfld      string ConsoleApplication5.BreakPointTest/'<>c__DisplayClass1'::myString