2012-05-22 41 views
10

錯誤CA1822:Microsoft.Performance:'SomeController.AnAction(string,string)'的'this'參數(或'Me'在Visual Basic中)從未使用過 。將該成員標記爲靜態(或在Visual Basic中共享),或者在方法體中使用 'this'/'Me'或至少使用一個屬性訪問器(如果 合適)。任何人都可以在控制器操作中解釋CA1822的目的和解決方案嗎?

當通過URL請求時,靜態操作產生404未找到。此操作按預期工作,代碼分析已關閉。這是什麼意思,什麼是適當的補救措施?

注意注意,動作的返回類型是PartialViewResult,如果返回類型是ActionResult,似乎沒有代碼分析抱怨這一點。

[HttpPost] 
    public PartialViewResult BlankEditorRow(string formId, Common.Entities.Common.ObjTypeEnum objType) 
    { 
     if (objType == Common.Entities.Common.ObjTypeEnum.Regular) 
      return new AjaxPartialViewResult("_RowEditor", new ProcedureEntryEntity()) { UpdateValidationForFormId = formId }; 
     else 
      return new AjaxPartialViewResult("_TemplateRowEditor", new ProcedureEntryEntity()) { UpdateValidationForFormId = formId }; 
    } 

更新:貌似改變返回類型的ActionResult解決了錯誤,並PartialViewResult是一個ActionResult所以它應該工作。

+0

請包括有問題的代碼或類似的snippit – robrich

回答

10

我懷疑,更改返回類型而不使用任何實例成員調用真的可以解決問題。我懷疑爲了改變返回類型,你把return語句改成了訪問實例成員的東西。

現在我不知道MVC中的路由處理是否將設爲您將該方法標記爲靜態,但這是值得研究的。儘管在性能方面給出了警告,但我會根據意圖和可讀性來考慮它。

典型地,有兩個原因方法或屬性是一個實例成員(而不是靜態):

  • 它需要訪問另一個實例成員,因爲它的行爲方式取決於的狀態反對
  • 它需要多態根據實際類型,它被稱爲實例上的表現,這樣的行爲可以被覆蓋

如果這些都不是的話,那麼該方法可以進行靜態哪些表示沒有預期的多態性並且不需要實例狀態。靜態成員有效地通告它所依賴的唯一狀態是類型本身(和參數)的狀態,並且它不會呈現多態。除了其他任何東西,這意味着你可以測試它也沒有創建實例。

當然,如果MVC的基礎設施要求它是一個實例方法,那麼你應該壓制警告,並註釋以表明這一事實。

+0

是的,如果你使它成爲靜態的,那麼這個動作在運行時是不可用的,因爲它使控制器的一個實例,並嘗試根據URL路由在那裏執行動作。如果它是一個ActionResult,我懷疑CA會讓這個幻燈片...因爲一旦我做出返回類型錯誤消失了(原始返回類型PartialViewResult從ActionResult繼承,所以沒有其他代碼需要更改)。雖然我不知道。我授予你的答案,因爲它的內容非常豐富,我學到了一些新的東西,儘管我們沒有達到真正的底部。 – BigOmega

4

我認爲CA並沒有考慮到這是MVC應用程序中的控制器操作。我會壓制。

相關問題