单步执行程序时,无故调用ToString()方法 - c#

这是一个奇怪的问题,我旁边的高级程序员也感到困惑。完全的问题是,以某种方式调用了我的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;
}

ToString()打印的这种看似随机的重复仅在我逐步执行程序时发生。它会在我上面指定的行上打印,并且在构造函数退出并在我逐步通过ToString()方法本身时显示为疯狂时也会打印。我在ToString()中放置了一个断点,但是只有在合法地调用ToString()时,它才会在断点处停止,因此请注意,当我逐步执行并进行此随机打印时,它不会在断点内停止ToString()。我经过并删除了对ToString()的所有调用,当我注释掉returnString变量并刚刚返回“她在那里”时,它仍然被随机调用,问题消失了,但这无济于事。如果我只运行没有断点的程序,则不会发生此问题。你们中的有些人可能会说,如果运行时可以正常运行,没关系,但是这让我非常警惕,如果我遇到了代码问题,而我会尝试逐步遍历代码以查找问题,那么我会得到不同的结果并妨碍调试。我尝试涵盖整个问题以及我尝试过的内容并提供所有需要的代码,如果我不清楚让我知道的事情,我将尝试再次进行解释。最后,我在Windows 7 64位计算机上,并且正在使用Visual Studio C#2010 Express。

参考方案

您可能在表单上有一块手表,或者以其他方式在调试器中显示它的值(通过“ locals”窗口,堆栈跟踪等)。调试器使用ToString显示对象。如果这是程序中的问题,则可能应该重新设计ToString,这样调用它就不会有问题,或者只是避免使用调试器。

您通常要避免使用非常“昂贵”的ToString,这是需要警惕的情况。有时可能会有例外,但确实如此,但呼叫者通常希望它是廉价的操作。考虑是否有一些其他方法/属性来代表更多涉及显示字符串的方法/属性是否合适,从而使实现更简单/更便宜。

如果DataReader返回两个结果集,则无法使用DataTable.Load()方法 - c#

为了提高性能,我试图消除Dataset的使用并实现DataReader。在这里,我的Oracle Procedure返回两个引用,当我将第一个记录集加载到第一个DataTable中时,下一个永远不会加载。示例代码如下所示:DataSet ds = new DataSet(); using (OracleConnection db = new OracleCo…

如何模拟保管库hvac.Client()方法 - python

在这里,我正在使用unittest框架和Python。def getsomevalue(name): client = hvac.Client(url ="http://1.2.3.4:31485",token = "abcdefghijkkk") sampledata= client.read('secre…

单元测试中的静态类/方法/属性,是否停止 - c#

考虑到没有引入不能再次测试的包装器就无法测试的方法,是否应该在单元测试开发环境中使用静态的类/方法/属性?另一种情况是,在单元测试目标中使用静态成员时,无法模拟静态成员。因此,在测试单元测试目标时,您必须测试静态成员。当静态成员执行计算时,您想隔离它。 参考方案 测试静态方法与测试任何其他方法没有什么不同。将静态方法作为依赖关系在另一个经过测试的模块中会引发…

Lambda函数如何成为Comparator的compare()方法 - java

我已经看到在Java 8中,可以这样定义一个比较器:Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge()); 等效于:Comparator d = new Comparator<Computer> () { @Override publi…

什么是将数组从C#返回到javascript的最佳(简单明了)方法 - c#

我知道这里有很多类似的问题,但是我没有发现有人问完全相同的问题。我正在使用ASP.NET和MVC4开发项目。我正在使用aspx作为视图引擎。我的视图中有一个javascript代码,该代码获得了一个值表,并根据它们创建了一个图形。我使用下面的查询从数据库中获取这些值 var query = from b in db.SchoolTestsPerModuleP…