当单步执行我的程序时,无缘无故地调用ToString()方法

use*_*817 2 c# debugging tostring visual-studio-2010

这是一个奇怪的问题,即使我旁边的高级程序员也很困惑.完整的问题是我的ToString()方法被调用,我不知道或不知道这是我的代码

static void Main(string[] args)
{
    Console.Out.WriteLine("Blank Constructor");
    Form form = new Form(); <-- ToString() gets called on this line.
    form.ToString();

    Console.Read();
 }

public Form()
{
    FormName = "";
    FormImageLocation = "";
    FormDescription = "";

    FormID = 0;

    CreatedDate = DateTime.Now;
    LastUpdate = DateTime.Now;

    Fields = new List<Field>();
    Packets = new List<Packet>(); <-- This line in the constructor
}

public override string ToString()
{
    string returnString;
    returnString = " Form Name: " +  FormName + " Form Image Location: " + FormImageLocation + "Form     Description: " + FormDescription + " FormID: " + FormID  + " Created Date: " + CreatedDate + "           LastUpdate: " + LastUpdate ;

    if (fields.Count != 0)
    {
        foreach (var field in fields)
        {
            returnString += field.ToString();
        }
    }
    else
    {
        returnString += "!!! This Form has no Fields !!!";
    }

    if (Packets.Count != 0)
    {
        foreach (var packet in Packets)
        {
            returnString += packet.ToString();
        }
    }
    else
    {
        returnString += " !!! This Form does not belong to any Packets !!!";
    }

    Console.Out.WriteLine(returnString);
    return returnString;
}

public Packet(string packet_name, List<Form> list_of_forms)
{
    PacketName = packet_name;
    forms = list_of_forms;
}
Run Code Online (Sandbox Code Playgroud)

这种看似随机的再次ToString()打印只会在我单步执行程序时发生.它将在我上面指定的行上打印,也可以在构造函数退出并打印时像疯了一样打开ToString()方法本身.我在其中设置了一个断点,ToString()但只有在ToString()合法调用时它才会在断点处停止,因此当我单步执行并且它执行此随机打印时它将不会停止在断点内ToString().我通过并删除了所有的调用ToString(),它仍然被随机调用,当我注释掉returnString变量并刚刚返回"她那里"问题消失但这没有任何帮助.如果我只是在没有断点的情况下运行程序,则不会发生此问题.你们中的一些人可能会说,如果它在运行时起作用并不重要但是它让我非常小心,如果我遇到代码问题,我试着通过代码来找到问题我会得到不同的结果并阻碍调试.我尝试覆盖整个问题以及我尝试过并提供所需的所有代码,如果我不清楚某些事情让我知道,我会再次尝试解释它.最后我在Windows 7 64位机器上,我使用的是Visual Studio C#2010 Express.

Ser*_*rvy 7

您可能在表单上有一个监视,或者以其他方式在调试器中显示它的值(通过"本地"窗口,堆栈跟踪等).调试器用于ToString显示对象.如果这是你的程序有问题,你应该有可能重新设计的ToString,使得它不是一个为它这样调用,否则简单地使用调试器回避的问题.

ToString你通常希望避免使用非常"昂贵" 的情况是一种需要警惕的情况.可能会偶尔出现例外情况,但是通话者通常认为它是一种廉价的操作.考虑是否适合使用其他方法/属性来表示更复杂的显示字符串,从而使实现更简单/更便宜ToString.