首页 新闻 搜索 专区 学院

请教一个问题,vs2013 在调试模式下运行和在直接执行不调试下执行为什么结果不一样

0
悬赏园豆:5 [待解决问题]

vs2013 在调试模式下运行和在直接执行不调试下执行得出的结果不一样

 class Program:Object
    {
        static void Main(string[] args)
        {
            TestClass test = new TestClass();
            Console.WriteLine(test.name);
            Console.ReadLine();
        }
    }

    class TestClass
    {
        public string name { get; set; }

        public override string ToString()
        {
            this.name += "1";
            string valaue = this.name;
            return valaue;
            
        }
    }

直接执行结果是“”

而调试模式下得出的是"1111"

这里在TestClass 类下面重新复写了ToString() 方法 发现在TestClass test = new TestClass(); 之后this.name 为“11” 

在test.name之后this.name的值为"111"

程序完成之后结果为"1111"

也是醉了!!!!

 

二乙青苔的主页 二乙青苔 | 初学一级 | 园豆:196
提问于:2015-08-02 12:27
< >
分享
所有回答(5)
0

有意思,我在VS2015下试了一下,果然如此

dudu | 园豆:37633 (高人七级) | 2015-08-02 12:52
0

我也测试了下,发现在之前打了断点,就会变成1,否则为“”。

幻天芒 | 园豆:36781 (高人七级) | 2015-08-02 14:06
0

。。。自己试一试。。。

顾晓北 | 园豆:10649 (专家六级) | 2015-08-03 09:46

试了一下,调试模式下,从TestClass test = new TestClass();在这句上加断点,走完,test.name是“11”,但在控制台输出的却是“1”,直接运行就是什么都不输出。。。

 

还有就是:调试模式下,有时候也什么也不输出,name为null。。。

支持(0) 反对(0) 顾晓北 | 园豆:10649 (专家六级) | 2015-08-03 10:18
0

还真是。。vs的bug吧

l3oz | 园豆:586 (小虾三级) | 2015-08-03 10:19

发现调试的时候,每次鼠标点开变量的时候,就会执行一次ToString。。。点一次执行一次,醉了

支持(0) 反对(0) l3oz | 园豆:586 (小虾三级) | 2015-08-03 10:23

搞明白怎么回事了,原来在debugging的时候,鼠标悬浮时,会调用ToString方法来显示当前实例的信息

 

如果想避免这种情况,需要加上DebuggerDisplayAttribute 这个标签显示提示信息

 

参考:https://msdn.microsoft.com/en-us/library/ms228992.aspx

支持(0) 反对(0) l3oz | 园豆:586 (小虾三级) | 2015-08-03 10:41
0

结论:
⦁ 说明子类不能够随意去覆写Object类的ToString()方法,谁知道VS在调试时调用ToString()方法做了些什么呢?
2.说明每次VS在调试我们点击类名,变量名要去查看里面的值的时候VS列出的值都是通过调用那个类的ToString()方法显示出来的,如果子类覆写了Object的ToString()方法那么就以子类方法为准
3.我们在程序里面打断点,其实VS到断点之后会把当前涉及到的变量的各种值都重新计算一次,重新计算时也调用了ToString()方法,同上,这也就是为什么即使我们在调试时不查看变量值,但是值也会改变的原因,而且调用ToString()的次数跟断点个数吻合
4.我们不能够随意覆写Object类的一些方法,除非没有这种this.name=“1”的在每次调用方法都会影响变量值得代码

二乙青苔 | 园豆:196 (初学一级) | 2015-08-04 23:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册