2010-09-19 116 views
0

很多时候我写的代码,如:空和默认值

<img class="hasMenu" src="<%= (Model.Image==null)?Url.Content("~/Content/NoImage.jpg"):Model.Image.standard %>" 
      alt="Main image" /> 

是否有任何预定义功能,这可以美容这个代码? 是这样的:ValueOrDefault(Model.Image.standard,Url.Content("~/Content/NoImage.jpg"))

回答

2

如果你的意思是:

(Model.Image.standard==null)?Url.Content("~/Content/NoImage.jpg"):Model.Image.standard 

那么你简化使用null-coalescing operator

Model.Image.standard ?? Url.Content("~/Content/NoImage.jpg") 

如果你的意思是你说的话,你可以写这样的方法这个:

static class Obj 
{ 
    public static T OrDefault<T>(Func<T> func, T def) 
    { 
     T result; 
     try 
     { 
      result = func(); 
     } 
     catch (NullReferenceException) 
     { 
      result = def; 
     } 
     return result; 
    } 
} 

and use it lik E本:

Obj.OrDefault(() => Model.Image.standard, Url.Content("~/Content/NoImage.jpg")) 
+0

但是,如果'Model.Image'为空则不起作用,那么无论如何你都会得到'NullReferenceException'。 – Patrick 2010-09-19 19:23:46

+0

是的,我知道。见编辑的答案。 – svick 2010-09-19 19:45:28

+0

很酷的解决方案!多一个建议:使这个方法像Control的扩展。 “public static T orDefault (this Control c,Func func,T def)”并且在没有“Obj”的情况下使用它。 – chapluck 2010-09-20 19:33:12

0

没有,有没有办法来检查,如果字段是null并与基础运营商部分来自你已经做了它的方式相同的语句中使用其财产。已经有关于“属性空合并运算符”的讨论,但在搜索论坛时我无法找到它。

你编码它的方式是最有效的方式,可能是在可读性方面。