逐步调试时重写 ToString() 不能正常工作
Override ToString() not working properly when step-by-step debugging
我正在尝试将方法 ToString()
覆盖到 class 中字段的 return 值并清除该字段(return 值仅一次)。我注意到当我 运行 在没有任何中断的情况下结束代码时,代码似乎可以工作(至少通过覆盖方法),但是在逐步调试时 return s 没有值,看起来对象的初始值没有存储值。
我已经设法通过将方法名称从 ToString()
更改为其他未覆盖的名称来解决此问题,同时注释行 text = "";
使其工作,但我没有知道为什么。
当我尝试将 StringBuilder 值分配给临时变量、清除 StringBuilder 和 return 临时值时,也发生了同样的情况。我很好奇是什么导致了这种奇怪的行为。
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
您实际看到的是 IDE 的评估结果,在您的例子中是 Visual Studio。似乎 Visual Studio 在 Locals
视图中加载了实例,并通过调用 ToString
确定了它的值,因此通过您的逻辑更改变量。 (VS 评估此方法的很多其他原因都是可能的,但对我来说这似乎是最有可能的。)
如您所见,依赖 ToString
方法的副作用是非常危险的。如果您想要可靠的代码,请使用其他一些 属性 或方法。
这是因为每次您将鼠标移到该对象上时,它都会执行 ToString 方法来为您提供要查看的内容。
在该方法的第二次执行中,您的对象丢失了字符串的值。
我正在尝试将方法 ToString()
覆盖到 class 中字段的 return 值并清除该字段(return 值仅一次)。我注意到当我 运行 在没有任何中断的情况下结束代码时,代码似乎可以工作(至少通过覆盖方法),但是在逐步调试时 return s 没有值,看起来对象的初始值没有存储值。
我已经设法通过将方法名称从 ToString()
更改为其他未覆盖的名称来解决此问题,同时注释行 text = "";
使其工作,但我没有知道为什么。
当我尝试将 StringBuilder 值分配给临时变量、清除 StringBuilder 和 return 临时值时,也发生了同样的情况。我很好奇是什么导致了这种奇怪的行为。
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
您实际看到的是 IDE 的评估结果,在您的例子中是 Visual Studio。似乎 Visual Studio 在 Locals
视图中加载了实例,并通过调用 ToString
确定了它的值,因此通过您的逻辑更改变量。 (VS 评估此方法的很多其他原因都是可能的,但对我来说这似乎是最有可能的。)
如您所见,依赖 ToString
方法的副作用是非常危险的。如果您想要可靠的代码,请使用其他一些 属性 或方法。
这是因为每次您将鼠标移到该对象上时,它都会执行 ToString 方法来为您提供要查看的内容。
在该方法的第二次执行中,您的对象丢失了字符串的值。