Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 逐步调试时重写ToString()无法正常工作_C#_Overriding_Tostring - Fatal编程技术网

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()
方法中有一个断点,它就不会命中断点(这是显而易见的原因),而这正是误导我的原因。谢谢:)