2012-11-22 50 views
0

这些天我遇到了many strange scenarios :-)方法调用不会抛出异常

我已经测试在ASP.Net应用程序下面的两个代码。代码1抛出异常(如预期的那样),而当字符串值为空时,代码2不会抛出异常(与期望相反)。

  1. 为什么“EVAL”在这种情况下不引发异常?
  2. EVAL的工作是否总是这样(即“没有例外”)还是仅仅是运气?
  3. 是否有任何说'Eval'返回空字符串的MSDN参考?

// 代码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. Eval check for DBNull doesnt work
  2. Convert.ToString behaves differently for "NULL object" and "NULL string"
  3. Datatype returned varies based on data in table
+3

如果你能想出一个*较短的例子 - 理想情况下在一个独立的控制台应用程序,它真的会有所帮助。我不知道什么'Eval'甚至* *在这里... –

+0

@JonSkeet我已经添加了ASP.Net标记并更新了问题 – Lijo

+4

我强烈地认为Eval返回'string.Empty'而不是'null'。 –

回答

1

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

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()returns "The string representation of value, or String.Empty if value is null"

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

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

+0

尝试用“string foo”而不是“object foo” – Lijo

+0

@Lijo在您称之为不是“奇怪的场景”时,它是[记录](http://msdn.microsoft.com/en-us/library /1a2xyyx8.aspx):_“'Convert.ToString(String)'返回指定的字符串实例;不执行实际的转换”_。如果你传递'null',它会返回'null',因此会发生异常。既然你知道这一点,我希望你能明白为什么会出现NullReferenceException,你可以做些什么来阻止它,以及为什么'Eval()'不会抛出异常(它必须返回一个非空字符串,或者一个非字符串值或对象)。 – CodeCaster

+0

是否有任何MSDN参考说'Eval'返回空字符串? – Lijo