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

时间:2019-06-07 12:58:54

标签: c# overriding tostring

我试图覆盖方法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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

之所以发生这种情况,是因为每次将鼠标移到该对象上时,它都会执行ToString方法来提供一些查看的对象。

在该方法的第二次执行中,您的对象丢失了字符串的值。