C#:为什么忽略此代码?
很抱歉这个奇怪的问题标题,但我真的不知道该怎么称呼这个。这对我来说毫无意义。代码如下:C#:为什么忽略此代码?,c#,winforms,C#,Winforms,很抱歉这个奇怪的问题标题,但我真的不知道该怎么称呼这个。这对我来说毫无意义。代码如下: public partial class ParameterPanel : FlowLayoutPanel { ... public void SetContents(IEnumerable<IParameter> parameters) { if (parameters == null || !parameters.Any())
public partial class ParameterPanel : FlowLayoutPanel
{
...
public void SetContents(IEnumerable<IParameter> parameters)
{
if (parameters == null || !parameters.Any())
return;
SuspendLayout();
Controls.Clear();
foreach (IParameter parameter in parameters)
{
Control control = Factory.Create(parameter);
Controls.Add(control);
}
Console.WriteLine("???");
ResumeLayout(false);
PerformLayout();
}
}
公共部分类参数面板:FlowLayoutPanel
{
...
公共void集合内容(IEnumerable参数)
{
if(parameters==null | |!parameters.Any())
返回;
SuspendLayout();
控件。清除();
foreach(参数中的IPParameter参数)
{
控制=工厂创建(参数);
控件。添加(控件);
}
控制台写入线(“???”);
简历布局(假);
执行布局();
}
}
奇怪的是,代码有时从未到达控制台。它进入foreach循环,但在最后一项之后,该方法只返回??它从未到达控制台。WriteLine
。我就是不明白。。。这怎么可能呢?最奇怪的是它也不总是发生。但这种情况在实际发生的情况下却始终如一
有人知道这是怎么回事吗?我甚至不知道从哪里开始寻找这个bug 添加检查控件是否已成功创建,如果未成功,则跳过添加
foreach (IParameter parameter in parameters)
{
Control control = Factory.Create(parameter);
if (control!=null) {
Controls.Add(control);
}
}
添加检查控件是否已成功创建,如果未成功,则跳过添加
foreach (IParameter parameter in parameters)
{
Control control = Factory.Create(parameter);
if (control!=null) {
Controls.Add(control);
}
}
一个奇怪的现象是:如果参数为null或空,则永远不会恢复或执行布局。。。我知道这不是你遇到的情况,但这是需要解决的问题
另一种可能是循环中的某个地方抛出了异常。一个奇怪的现象:如果参数为null或空,则永远不会恢复或执行布局。。。我知道这不是你遇到的情况,但这是需要解决的问题
另一种可能性是循环中的某个地方抛出异常。如果方法中的某个部分抛出异常,则将跳过该方法的其余部分
点击Debug->Exceptions并勾选CLR Exceptions框,以便在抛出异常时立即使其变为中断。如果方法中的某些内容正在抛出异常,则将跳过该方法的其余部分
点击Debug->Exceptions并勾选CLR Exceptions框,以便在抛出异常时立即启用或禁用。可能是foreach中发生的异常,请尝试选中Debug->Exceptions->Common language runtime Exceptions,查看是否存在异常。可能是foreach中发生的异常,试着检查Debug->Exceptions->Common language runtime Exceptions,看看是否有任何异常,正如Jon Skeet所说的-
if (parameters == null || !parameters.Any()) return;
正在返回函数,因此在这种情况下,您将永远无法获得更多。在方法开始时强制执行这种契约是很常见的,但在这种情况下通常会抛出一个异常。正如Jon Skeet所说,这一行-
if (parameters == null || !parameters.Any()) return;
正在返回函数,因此在这种情况下,您将永远无法获得更多。通常在方法开始时强制执行此类约定,但在这种情况下通常会抛出异常。是不是Controls.Add()在这一点上失败了?我假设异常会将您踢出方法…啊,grr,找到了。工厂创建的一个控件的构造函数中发生了NullReferenceException。让我感到不快的是,这个异常没有使任何东西崩溃。它只是。。。很显然,这件事发生了,被忽视了。在输出控制台中注意到它。必须在调试->异常中为该异常启用中断功能。。。菜单。哦,好吧。。。我发现寻求帮助通常能确保你自己在几分钟后找到解决方案!:-)很高兴您对其进行了排序。如果调用线程位于应用程序域之外,则默认行为是默默地吞下异常(如果我没有记错,则仅当从visual studio运行应用程序时才会发生)。在将文件拖放到我的应用程序中时,我遇到了一个异常引发的同样问题。Controls.Add()是否会在这一点上失败?我假设一个异常会将您踢出该方法…啊,grr,找到它了。工厂创建的一个控件的构造函数中发生了NullReferenceException。让我感到不快的是,这个异常没有使任何东西崩溃。它只是。。。很显然,这件事发生了,被忽视了。在输出控制台中注意到它。必须在调试->异常中为该异常启用中断功能。。。菜单。哦,好吧。。。我发现寻求帮助通常能确保你自己在几分钟后找到解决方案!:-)很高兴您对其进行了排序。如果调用线程位于应用程序域之外,则默认行为是默默地吞下异常(如果我没有记错,则仅当从visual studio运行应用程序时才会发生)。在将文件拖放到我的应用程序中的过程中,我遇到了一个异常引发的同样问题。哦,没错。谢谢你让我知道!哦,那是真的。谢谢你让我知道!是的,是用那个找到的。但是为什么它一开始就没有破裂呢?我得到的只是“app.dll中发生了'System.NullReferenceException'类型的第一次意外异常”,我不知道它是从哪里被吃掉的。是不是有更高级的东西捕捉到了异常。我注意到您继承了FlowLayoutPanel;是否从某个重写方法捕获集合内容,该方法在处理异常的FlowLayoutPanel中具有调用方?尝试处理AppDomain.CurrentDomain.UnhandledException事件,以查看它是否发生在后台线程上-尽管这看起来像GUI代码,我假设它不在后台线程上。是的,使用它找到它。但是为什么它一开始就没有破裂呢?我得到的只是“app.dll中发生了'System.NullReferenceException'类型的第一次意外异常”,我不明白是什么原因造成的