Переопределить ToString () не работает должным образом при пошаговой отладке - PullRequest
2 голосов
/ 07 июня 2019

Я пытаюсь переопределить метод 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 ]

3 голосов
/ 07 июня 2019

То, что вы на самом деле видите, является результатом оценки IDE, в вашем случае Visual Studio.Кажется, Visual Studio загрузил экземпляр в представлении Locals и определил его значение, вызвав ToString, таким образом, изменив переменные в вашей логике.(Довольно много других причин, по которым VS оценил этот метод, возможно, но мне он кажется наиболее вероятным.)

Очень опасно полагаться на побочные эффекты метода ToString, поскольку у вас естьопытный.Если вам нужен надежный код, используйте другое свойство или метод.

1 голос
/ 07 июня 2019

Это происходит потому, что каждый раз, когда вы наводите указатель мыши на объект, он выполняет метод ToString, чтобы дать вам что-то для просмотра.

При втором выполнении этого метода ваш объект теряет строковое значение.

...