1

这些天我遇到了许多奇怪的情况:-)

我在 ASP.Net 应用程序中测试了以下两个代码。当字符串值为空时,代码 1 抛出异常(如预期)而代码 2 不抛出异常(与预期相反)。

  1. 为什么“<strong>EVAL”在这种情况下不抛出异常?
  2. EVAL 会一直这样工作(即“没有例外”)还是只是运气?
  3. 是否有任何 MSDN 参考表明“Eval”返回空字符串?

//代码 1:导致异常

 string test = Convert.ToString(subscriber.EncryptedSSN).Substring(0, Convert.ToString(subscriber.EncryptedSSN).Length >= 5 ? 5 : Convert.ToString(subscriber.EncryptedSSN).Length);

//代码2:不抛出异常

 <%# Convert.ToString(Eval("EncryptedSSN")).Substring(0, Convert.ToString(Eval("EncryptedSSN")).Length  >= 5 ? 5 : Convert.ToString(Eval("EncryptedSSN")).Length)  %>

参考资料

  1. DBNull 的评估检查不起作用
  2. Convert.ToString 对于“NULL 对象”和“NULL 字符串”的行为不同
  3. 返回的数据类型因表中的数据而异
4

2 回答 2

6

您的情况似乎不正确。第一个在 .NET 4 上对我没有例外:

object foo = null;

string test = Convert.ToString(foo).Substring(0, Convert.ToString(foo).Length >= 5 ? 5 : Convert.ToString(foo).Length);

这是因为Convert.ToString() 返回"The string representation of value, or String.Empty if value is null"

String.Empty 不是 null,它是一个长度为 0 的字符串,所以在其上调用方法时不会抛出异常。

一番搜索后,我来到了这个页面,一般解释了 ASP 中的数据绑定,它解释了“在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法”DataBinder.Eval()返回一个对象,因此Convert.ToString(Eval(Something))至少会返回String.Empty,因此如果您尝试访问其结果的成员或属性,则不会抛出 NullReferenceException。

于 2012-11-22T13:51:02.303 回答
1

你的Eval评价是什么?也许它String.Empty不是 null ,在这种情况下你不会得到异常。

于 2012-11-22T13:50:58.987 回答