我在类中有以下方法:
public IPlayerInfo GetPlayerInfo(int playerId)
{
return GetPlayerDetails(playerId).Matches; // Matches have Runs and Wickets list
}
我有一个课程如下:
public class MyClass
{
public Lazy<IMyInterface> _service1;
public MyClass(Lazy<IMyInterface> service1)
{
_serivce1 = service1;
}
public void SomeMethod()
{
var runsList = _serivce1.GetPlayerInfo(1).Runs; // debugging this line of code
}
}
当我尝试调试上面的代码时,
- 我使用快速手表(
Shift + F9
(观察了_serivce1.GetPlayerInfo(1)
的价值。我扩展了它的所有子节点。它的一个子节点是Runs
。我扩展了Runs
.它显示了Expanding the Results View will enumerate the IEnumerable
.我列举了它。里面空空如也。 - 我没有关闭调试
- 一段时间后,当我按 shift + F9 并在快速监视中再次查看它时,它在我枚举 IEnumerable 后添加了一个项目。魔法!
- 一段时间后,当我按 shift + F9 并在快速观看中再次查看它时,它在我枚举 IEnumerable 后添加了第二项。幻方!!
- 然后,由于
_serivce1.GetPlayerInfo(1).Runs
添加了两个项目,我没有加载_serivce1.GetPlayerInfo(1)
并扩展子节点Runs
,而是尝试直接调试_serivce1.GetPlayerInfo(1).Runs
,但它是空的:(
当我在没有调试的情况下运行时,_serivce1.GetPlayerInfo(1).Runs
(以及runsList
(根本没有 itmes。如果这是由于延迟执行,请告诉我。另外,请让我知道解决方案。
它不是延迟执行,它只是以正常方式运行代码的概览。
除了不使用概览或可能开始使用描述它们如何规避至少某种副作用的 OzCode 之外,这种类型的副作用没有"解决方案"。
某处的某些东西将 1 添加到运行中。当你执行_serivce1.GetPlayerInfo(1)
时,这个东西会运行。
(1( 找到此位置并设置断点
,或 (2( 在GetPlayerInfo
中设置断点。
然后在"即时"窗口中写? _serivce1.GetPlayerInfo(1)
。
与概览相反,"即时"窗口会触发断点。
执行 (1( 应该在断点
中停止执行,而 (2( 允许您调试单步执行,直到找到添加的位置。