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());
}
例如:
无断点的正常输出
14
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来观看。它不会改变。在中间运行时观察和检查值它们有不同的功能吗?