2010-09-19 139 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並與基礎運營商部分來自你已經做了它的方式相同的語句中使用其財產。已經有關於「屬性空合併運算符」的討論,但在搜索論壇時我無法找到它。

你編碼它的方式是最有效的方式,可能是在可讀性方面。