逐步调试时覆盖 ToString() 无法正常工作

Sła*_*wek 3 c# overriding tostring

我正在尝试重写方法ToString()以返回类中字段的值并清除该字段(仅返回一次值)。我注意到,当我运行代码时,代码似乎可以正常工作,直到最后没有任何中断(至少通过重写方法),但是当逐步调试时,它没有返回任何值,并且看起来有对象的 init 处没有存储任何值。

我已经设法通过将方法的名称更改为ToString()其他未覆盖的名称来解决此问题,同时注释该text = "";行使其可以工作,但我不知道为什么。当我尝试将 StringBuilder 值分配给临时变量、清除 StringBuilder 并返回临时值时,也发生了同样的情况。我很好奇是什么导致了这种奇怪的行为。

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我将代码运行到 ReadKey(); 时 没有中断的输出是:

1 MyClass: some value
1 MyClass2: some value
2 MyClass:
2 MyClass2: some value
Press any key to exit
Run Code Online (Sandbox Code Playgroud)

使用 F10 单步执行代码时,输​​出为:

1 MyClass:
1 MyClass2: some value
2 MyClass:
2 MyClass2: some value
Press any key to exit
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 5

您实际看到的是 IDE(在您的例子中为 Visual Studio)的评估结果。Visual Studio 似乎在视图中加载了实例Locals,并通过调用确定其值ToString,从而通过您的逻辑更改变量。(VS 评估此方法的许多其他原因都是可能的,但这对我来说似乎是最有可能的一个。)

ToString正如您所经历的那样,依赖该方法的副作用是非常危险的。如果您想要可靠的代码,请使用其他一些属性或方法。