VS踩坑记录:C#中属性get块含有写入代码,断点调试时读取属性get块一样会造成写入效果

我很多时候贪图方便,喜欢在属性的get块中加入对其他变量修改的操作……如果你跟我有一样的习惯,而且正在使用VisualStudio断点调试,那就要小心了= =

最近在整一个链表,我希望可以实现取出链表中第一个结点(head)。由于平时的坏习惯,没有用函数,而是直接用了属性的get块实现:

然后在链表测试的时候,出现了错误(事实上我的错误是别的错误,但是这导致我使用断点调试发现了本文要讨论的蛇皮错误)于是我进入断点调试模式……监控变量。
然后我发现神奇的事情发生了:head前一秒还正在,后一秒就消失!!!
比如这样:

前一秒还是head != null的
然而后一秒……我甚至没有执行下一步,就再看了一次

好的head已经变成null了,只因在人群中多看了它一眼

???
我当场就日了狗了,每次变成null的时间点还不一样,但都是在我查看之后没了!
当时完全不知道是什么问题
第二天逐个排查,最后发现在删除了PopFirstNode属性之后就不会出现这个问题(没想到竟然是这个)
而且非断点调试也不会出现这个问题
那问题大概就明朗了:
断点调试中可以看到代码中的变量值,然而属性值是怎么看的呢?到这里,其实已经很显然是通过get块读取的了。也正是因为通过它是通过get块读取了(PopFirstNode属性的)变量值,它同样执行了其中的变量修改代码,于是乎head就理所当然变成下一个元素,也就是null了……也说明为什么第一次看还是在的,然而第二次再看就突然变成null了。
其实就是VS断点调试时读取属性值会隐式访问属性中的get块(没错,这个过程本身是不会触发断点的,所以我们能感觉到的就只是莫名其妙出现了问题)

同样在另一篇文章也看到类似的描述:
C#断点调试时属性get块逻辑执行多次

但是遗憾的是,我把该项设置反选后并无事发生……还是能读取属性值,也还是能删掉我的head
不过问题不大了,只是没想到自己的习惯居然会带来这么难找的bug

所以如果你在使用断点调试(vs的,其他的不知道会不会有这种问题)请注意:
①属性get块尽量不要有写入操作
②如果真的改不了习惯,你要清楚意识到这个问题!并且在调试时不要在能读取属性的地方加入断点,可以考虑直接控制台print变量(不要用属性喔 否则还是会访问get块)

哎 又被莫名其妙的小问题耗了一天 欢乐时光又要结束了 妈耶

原创文章 6 获赞 10 访问量 1385

猜你喜欢

转载自blog.csdn.net/mkr67n/article/details/105992818