对象的方法调用不会抛出异常

LCJ*_*LCJ 0 .net c# asp.net

这些天我遇到了很多奇怪的场景 :-)

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

  1. 为什么" 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);
Run Code Online (Sandbox Code Playgroud)

// 代码2:不抛出异常

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

参考文献:

  1. DBNull的Eval检查不起作用
  2. Convert.ToString对"NULL对象"和"NULL字符串"的行为有所不同
  3. 返回的数据类型因表中的数据而异

Cod*_*ter 6

您的方案似乎不正确.第一个在.NET 4上没有给我一个例外:

object foo = null;

string test = Convert.ToString(foo).Substring(0, Convert.ToString(foo).Length >= 5 ? 5 : Convert.ToString(foo).Length);
Run Code Online (Sandbox Code Playgroud)

这是因为Convert.ToString() 返回"值的字符串表示形式,如果值为null返回String.Empty".

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

一些搜索引导我进入这个页面,一般解释ASP中的数据绑定,并解释说"在运行时,Eval方法调用DataBinder对象的Eval方法".DataBinder.Eval()返回一个对象,因此Convert.ToString(Eval(Something))至少会返回String.Empty,因此如果您尝试访问其结果的成员或属性,则不会抛出NullReferenceException.