Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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#调试和结果更改_C# - Fatal编程技术网

C#调试和结果更改

C#调试和结果更改,c#,C#,我在面试任务中发现了这个代码。结果取决于调试。为什么在调试模式下更改值?请解释一下它是如何工作的 static IEnumerable<int> Square(IEnumerable<int> a) { foreach (var r in a) { Console.WriteLine(r * r); yield return r * r; } } class Wrap { private static int

我在面试任务中发现了这个代码。结果取决于调试。为什么在调试模式下更改
?请解释一下它是如何工作的

static IEnumerable<int> Square(IEnumerable<int> a)
{
    foreach (var r in a)
    {
        Console.WriteLine(r * r);
        yield return r * r;
    }
}
class Wrap
{
    private static int init = 0;
    public int Value1
    {
        get { return ++init; }
    }
}

static void Main(string[] args)
{
    var w = new Wrap();
    var wraps = new Wrap[3];
    for (int i = 0; i < wraps.Length; i++)
    {
        wraps[i] = w;
    }
    var values = wraps.Select(x => x.Value1);
    var results = Square(values);
    int sum = 0;
    int count = 0;
    foreach (var r in results)
    {
        count++;
        sum += r;
    }
    Console.WriteLine("Count {0}", count);
    Console.WriteLine("Sum {0}", sum);

    Console.WriteLine("Count {0}", results.Count());
    Console.WriteLine("Sum {0}", results.Sum());
}
static IEnumerable Square(IEnumerable a)
{
foreach(a中的var r)
{
控制台写入线(r*r);
收益率r*r;
}
}
类包装
{
私有静态int init=0;
公共价值1
{
获取{return++init;}
}
}
静态void Main(字符串[]参数)
{
var w=新包装();
var wraps=新wraps[3];
for(int i=0;ix.Value1);
var结果=平方(值);
整数和=0;
整数计数=0;
foreach(结果中的var r)
{
计数++;
总和+=r;
}
WriteLine(“Count{0}”,Count);
WriteLine(“Sum{0}”,Sum);
WriteLine(“Count{0}”,results.Count());
WriteLine(“Sum{0}”,results.Sum());
}
例如: 无断点的正常输出

1
4
9
计数3
总和14
16
25
36
计数3
49
64
81
总数194

但如果您应该将断点放在
wrapps[i]=w附近并多次展开值

您可以得到如下结果:

16
25
36
计数3
总和77
49
64
81
计数3
100
121
144
总数365

甚至更大。结果取决于在调试模式下观察变量值的次数。为什么?


我正在调试器中运行,单步执行代码并检查属性

如果设置断点并使用监视窗口查看值1
,调试器将访问此属性

通过访问
Value1
,执行getter代码,因此

get { return ++init; }

init
增加
1

如果设置断点并使用监视窗口观察
Value1
,调试器将访问此属性

通过访问
Value1
,执行getter代码,因此

get { return ++init; }

init
增加
1

如果您不说出在每种情况下看到的结果,也无济于事。(将整个过程放在一个我们可以复制/粘贴/编译并运行的环境中也会有所帮助——每个想要重现问题的人都必须添加包含类并使用指令,这是没有意义的。)还要注意,“在调试模式下构建”、“在调试器中运行而不中断”和在调试器中运行,单步执行代码并检查属性“-您指的是哪一个?想想Value1的作用。如果你在运行过程中检查它的值,会发生什么?@ SamiKuhmonen,但是如果我应该添加例如Value1来观看。它不会改变。在中间运行时观察和检查值它们有不同的功能?你们不说你们在每种情况下看到了什么结果也无济于事。(将整个过程放在一个我们可以复制/粘贴/编译并运行的环境中也会有所帮助——每个想要重现问题的人都必须添加包含类并使用指令,这是没有意义的。)还要注意,“在调试模式下构建”、“在调试器中运行而不中断”和在调试器中运行,单步执行代码并检查属性“-您指的是哪一个?想想Value1的作用。如果你在运行过程中检查它的值,会发生什么?@ SamiKuhmonen,但是如果我应该添加例如Value1来观看。它不会改变。在中间运行时观察和检查值它们有不同的功能吗?