C# 逐步调试时重写ToString()无法正常工作
我试图重写方法C# 逐步调试时重写ToString()无法正常工作,c#,overriding,tostring,C#,Overriding,Tostring,我试图重写方法ToString(),以返回类中某个字段的值并清除该字段(只返回一次值)。我注意到,当我运行代码时,代码似乎可以正常工作,但在一步一步地调试时,它不会返回任何值,并且看起来在对象的init处没有存储任何值 通过将方法的名称从ToString()更改为其他未重写的名称,并注释行text=”“,我成功地解决了这个问题使它工作,但我不知道为什么。 当我尝试将一个StringBuilder值分配给temp var、清除StringBuilder并返回temp值时,也发生了同样的情况。我很好
ToString()
,以返回类中某个字段的值并清除该字段(只返回一次值)。我注意到,当我运行代码时,代码似乎可以正常工作,但在一步一步地调试时,它不会返回任何值,并且看起来在对象的init处没有存储任何值
通过将方法的名称从ToString()
更改为其他未重写的名称,并注释行text=”“,我成功地解决了这个问题代码>使它工作,但我不知道为什么。
当我尝试将一个StringBuilder值分配给temp var、清除StringBuilder并返回temp值时,也发生了同样的情况。我很好奇是什么导致了这种奇怪的行为
class Program
{
public class MyClass
{
private string text = "some value";
public override string ToString()
{
string temp = text;
text = "";
return temp;
}
}
public class MyClass2
{
private string text = "some value";
public override string ToString()
{
return text;
}
}
static void Main(string[] args)
{
MyClass obj = new MyClass();
MyClass2 obj2 = new MyClass2();
Console.WriteLine("1 MyClass: " + obj.ToString());
Console.WriteLine("1 MyClass2: " + obj2.ToString());
Console.WriteLine("2 MyClass: " + obj.ToString());
Console.WriteLine("2 MyClass2: " + obj2.ToString());
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
当我运行ReadKey()的代码时;无中断时,输出为:
1 MyClass: some value
1 MyClass2: some value
2 MyClass:
2 MyClass2: some value
Press any key to exit
1 MyClass:
1 MyClass2: some value
2 MyClass:
2 MyClass2: some value
Press any key to exit
使用F10单步执行代码时,输出为:
1 MyClass: some value
1 MyClass2: some value
2 MyClass:
2 MyClass2: some value
Press any key to exit
1 MyClass:
1 MyClass2: some value
2 MyClass:
2 MyClass2: some value
Press any key to exit
您实际看到的是IDE评估的结果,以Visual Studio为例。visualstudio似乎在Locals
视图中加载了实例,并通过调用ToString
来确定其值,从而通过您更改变量的逻辑来确定。(这种方法还有很多其他原因,但对我来说,这似乎是最有可能的。)
正如您所经历的那样,依赖ToString
方法的副作用是非常危险的。如果您想要可靠的代码,请使用其他属性或方法。这是因为每次您将鼠标移到对象上时,它都会执行ToString方法,以便为您提供可查看的内容
在该方法的第二次执行中,您的对象将丢失字符串的值。使用ToString()ToString
似乎非常奇怪,而且可能非常混乱,不应产生副作用。某些方法具有特定的用途,不应用于更改状态。由于您正在调用ToString()
无论如何,只需创建一个名称更好的方法,例如GetStringAndReset()
。如果是用于调试,我经常使用debuggerdisplayattribute
请参见。看起来您是对的,在局部视图中有一个对象变量列表和一个显示所有ToString()的整个对象值
方法返回。我还注意到,当VS调用该方法时,如果ToString()
方法中有一个断点,它就不会命中断点(这是显而易见的原因),而这正是误导我的原因。谢谢:)