我试图覆盖方法ToString()
以返回类中某个字段的值并清除该字段(仅返回一次值)。我已经注意到,代码在运行时没有任何中断(至少通过重写方法)时似乎可以正常工作,但是在逐步调试时,它没有返回任何值,并且看起来好像没有值存储在对象的初始位置。
我设法通过将方法的名称从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
使用F10单步执行代码时,输出为:
1 MyClass:
1 MyClass2: some value
2 MyClass:
2 MyClass2: some value
Press any key to exit
答案 0 :(得分:3)
您实际看到的是IDE(对于您的Visual Studio)进行评估的结果。似乎Visual Studio在Locals
视图中加载了实例,并通过调用ToString
来确定其值,因此可以通过逻辑来更改变量。 (很多其他原因也使VS评估了此方法是可行的,但对我来说,这似乎是最有可能的。)
如您所见,依靠ToString
方法的副作用是非常危险的。如果您想要可靠的代码,请使用其他一些属性或方法。
答案 1 :(得分:1)
之所以发生这种情况,是因为每次将鼠标移到该对象上时,它都会执行ToString方法来提供一些查看的对象。
在该方法的第二次执行中,您的对象丢失了字符串的值。