为什么此代码在没有异常的情况下工作

时间:2013-07-23 15:54:45

标签: c# .net string null

在Windows窗体中,我在load事件中调用了一个方法。在那里我用这个填充一些TextBox:

     foreach (TabPage page in tabControl_Berichte.TabPages)
        {
            uc_MusterberichtProzessdetails bla = (uc_MusterberichtProzessdetails)page.Controls[0];

            object val = musterbericht.GetType().GetProperty(page.Name + "_Bem").GetValue(musterbericht, null);
                bla.tB_Bemerkung.Text = val.ToString();

            val = musterbericht.GetType().GetProperty(page.Name + "_Bearb").GetValue(musterbericht, null);
                bla.tB_Bearbeiter.Text = val.ToString();

            val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null);
                bla.tB_Datum.Text = val.ToString().Substring(0, 10);

            val = musterbericht.GetType().GetProperty(page.Name + "_Erledigt").GetValue(musterbericht, null);
                bla.chB_Erledigt.Checked = (bool)val;

            val = musterbericht.GetType().GetProperty(page.Name + "_Dauer").GetValue(musterbericht, null);
                bla.tB_Dauer.Text = val.ToString();
        }

除了作为DateTime的“_Datum”之外,所有属性都是字符串? 调用该方法时,将为每个TabPage加载数据。

在我的示例中,一个TabPage加载正确。在第2个TabPage,Date属性为null。所以在此之后:

val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null);

val为空。

在下一行:

bla.tB_Datum.Text = val.ToString().Substring(0, 10);

我可以在调试期间看到当鼠标悬停ToString()时会显示“”(空字符串)。 但如果我现在点击F10,我的表格将会显示。该方法是停止的。该程序运行(以下TextBox和选项卡未填充数据)。

没有例外!!我不明白。并且没有任何尝试捕获。

如果我直接使用设置为null的对象尝试此操作,则会抛出异常。

那么这里发生了什么?为什么我的程序仍然有效?

(现在我测试每个val = ...如果val!= null,那么这不是问题。)

编辑:

我刚尝试过这个:

    DateTime? dttest = null;
    object objtest = dttest;
    string strtest = objtest.ToString();

这里我在ToString()处得到一个例外。

在上面的例子中我也试过

    val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null);
if (val.ToString().Length > 0)
    bla.tB_Datum.Text = val.ToString().Substring(0, 10);

这里几乎与上面的行为相同。此处方法在if (val.ToString().Length > 0)处停止,并且正在中止加载事件。 (仍然不例外)

看起来val.ToString()正在运行,但val.ToString().xxxxx会导致这种奇怪的行为。

1 个答案:

答案 0 :(得分:1)

您可以查看msdn docs,或使用reflector / dotPeek查看Nullable<T>覆盖ToString(),如果为空,则返回"",而不是投掷。

DateTime?只是Nullable<DateTime>,这就是为什么你得到一个空字符串而且没有例外。

修改:当.Substring(0, 10)执行时,该方法可能会“结束”,因为您将获得ArgumentOutOfRangeException。空字符串的长度为0,因此您不能要求长度为10的子字符串。