简化后的代码如下:
{
static void Main(string[] args)
{
SimpleClass simpleClass = new SimpleClass();
string myString = simpleClass.OneField;
}
}
public class SimpleClass
{
private string _oneField = string.Empty;
public string OneField
{
get
{
if (_oneField.Length == 0)
{
_oneField = GetMyString();
}
return _oneField;
}
}
private string GetMyString()
{
return "just for test~";
}
}
无法调试的代码即“_oneField = GetMyString();”这一行。
大家可以自行调试,会发现是因为_oneField这个变量总是被莫名其妙的赋上值了,但明明我们还没有给它赋值……
和同事讨论过后,还是没有得出明确的结论,只是推测可能是因为Visual Studio在调试的过程中,自动扫描对象中的属性,然后自行运行属性的get操作~
不知道大家有没有遇到这种情况,虽然最终通过把OneField属性改写成函数解决了这个问题,但还是有些不爽,难道在Visual Studio就真的没有办法调试如上代码?
更新结论:
经过大家的反馈,我重复试了多次,总结如下,欢迎大家反馈意见——
要重现我以上的问题,可按如下步骤操作:在“SimpleClass simpleClass = new SimpleClass();”这一行加上断点,然后逐行调试,并且(请注意,这一点很重要,相信很多兄弟和我的调试结果不一样,可能就是因为这个原因),满足以下任一条件:
1、在调试过程中打开了Autos窗口
2、将simpleClass.OneField添加到了Watch中
3、运行到“simpleClass.SecondField = "me";”这一行时,鼠标移到对象“simpleClass”上,在弹出的信息显示层中点击“+”,查看一下“simpleClass”对象的各属性值,嗯,这个操作的作用和打开Autos窗口一样)
那么,最终是无法到达“_oneField = GetMyString();”这一行的;
进一步更新:
本以为以上发现的问题不会影响程序运行的结果,但却意外发现有时也会影响到程序最终运行的结果——
代码如下:
{
static void Main(string[] args)
{
SimpleClass simpleClass = new SimpleClass();
simpleClass.SecondField = "me";
string myString = simpleClass.OneField;
Console.WriteLine(myString);
Console.Read();
}
}
public class SimpleClass
{
private string _oneField = string.Empty;
private string _secondField = string.Empty;
public string OneField
{
get
{
if (_oneField.Length == 0)
{
_oneField = GetMyString();
}
return _oneField;
}
}
public string SecondField
{
get { return _secondField; }
set { _secondField = value; }
}
private string GetMyString()
{
return "SecondField:" + SecondField;
}
}
以上这段代码正确的输出应该是:“SecondField:me”。
但如果我们在调试中这样做了的话。。。
嗯,还是从“SimpleClass simpleClass = new SimpleClass();”这一行开始逐行调试,运行到“simpleClass.SecondField = "me";”这一行时(注意,一定要在运行“simpleClass.SecondField = "me";”这一语句之前进行以下操作),鼠标移到对象“simpleClass”上,在弹出的信息显示层中点击“+”,查看一下“simpleClass”对象的各属性值,然后,OK,F5吧,你会发现,最后的输出变成了:“SecondField:”!!!
到目前为止最好的解决办法:
Options -> Debugging -> General -> Enabled property evaluation and other implicit function calls
去掉这个选项的选中状态!
然后,以上所有的问题都得以解决——这个世界,终于清静了。。。。。。
感谢Q.yuhen兄弟!