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"
也是醉了!!!!
有意思,我在VS2015下试了一下,果然如此
我也测试了下,发现在之前打了断点,就会变成1,否则为“”。
。。。自己试一试。。。
试了一下,调试模式下,从TestClass test = new TestClass();在这句上加断点,走完,test.name是“11”,但在控制台输出的却是“1”,直接运行就是什么都不输出。。。
还有就是:调试模式下,有时候也什么也不输出,name为null。。。
还真是。。vs的bug吧
发现调试的时候,每次鼠标点开变量的时候,就会执行一次ToString。。。点一次执行一次,醉了
搞明白怎么回事了,原来在debugging的时候,鼠标悬浮时,会调用ToString方法来显示当前实例的信息
如果想避免这种情况,需要加上DebuggerDisplayAttribute 这个标签显示提示信息
结论:
⦁ 说明子类不能够随意去覆写Object类的ToString()方法,谁知道VS在调试时调用ToString()方法做了些什么呢?
2.说明每次VS在调试我们点击类名,变量名要去查看里面的值的时候VS列出的值都是通过调用那个类的ToString()方法显示出来的,如果子类覆写了Object的ToString()方法那么就以子类方法为准
3.我们在程序里面打断点,其实VS到断点之后会把当前涉及到的变量的各种值都重新计算一次,重新计算时也调用了ToString()方法,同上,这也就是为什么即使我们在调试时不查看变量值,但是值也会改变的原因,而且调用ToString()的次数跟断点个数吻合
4.我们不能够随意覆写Object类的一些方法,除非没有这种this.name=“1”的在每次调用方法都会影响变量值得代码