2015-04-02 27 views
1

我對代碼分析Visual Studio中警告有點困惑。下面的代碼引起的:解釋的「CA1800:不要不必要地投」需要

static void Main(string[] args) 
{ 
    var something = new Something(); 
    object expression = "Any value"; 
    for (int i = 0; i < 2; i++) 
    { 
     switch (i) 
     { 
      case 0: 
       something.Help = expression as string; 
       break; 

      case 1: 
       something.Description = expression as string; 
       break; 
     } 
    } 
} 

class Something 
{ 
    public string Help; 
    public string Description; 
} 

documentation of CA1800說:

...重複施放降低性能,尤其是當鑄件 在緊湊循環語句執行。對於顯式重複 投業務,投的結果存儲在一個局部變量和 使用本地變量而不是重複投業務。 ...

我可以使用和分配一個局部變量,是的。但上面顯示的演員將不會在一次迭代中執行。所以,在我看來,這不會比使用局部變量更昂貴。

在我的真實方法中,變量expression可以具有其他類型的許多其他類型和類別Something的屬性。還有另一個參數,它取代了i,並且沒有for-loop

假設我創造的任何可能的類型的expression一個局部變量。然後許多演員操作將被執行,而只有一個將需要。

for (int i = 0; i < 2; i++) 
{ 
    var type1 = expression as Type1; 
    var type2 = expression as Type2; 
    var type3 = expression as Type3; 
    var type4 = expression as Type4; 
    switch (i) 
    { 
     case 0: 
      something.*** = type1; 
      break; 

     case 1: 
      something.*** = type2; 
      break; 

     ... 
    } 
} 

即貴...

有人可以告訴我這個警告的背景是什麼?這對我沒有任何意義。

+0

您提供的代碼不會導致該警告我。這就是說,爲什麼'expression'首先被當作'object'而不是'string'輸入? – Servy 2015-04-02 14:24:16

+0

@Servy你是否啓用了代碼分析?在我選擇的示例項目** Microsoft All Rules **中。提供的代碼是一個樣本,在語義上,這是沒有意義的。所以請刪除downvote .... – 2015-04-02 14:28:06

+1

是的,我運行代碼分析,並沒有得到這個警告。在你的同樣的情況下,對於一個多餘演員的警告很有意義,因爲*你的樣本有一個多餘的演員*。如果你有一個樣本需要在該樣本中進行演員表,並且仍然收到警告,那麼*那*表示*某事*。也就是說,警告是警告;他們有誤報。這就是爲什麼他們不是錯誤。 – Servy 2015-04-02 14:30:12

回答

3

的警告,表明你鑄造,因爲循環多次。這應該解決這個問題:

var something = new Something(); 
object expression = "Any value"; 
string expressionAsString = expression as string; 
for (int i = 0; i < 2; i++) 
{ 
    switch (i) 
    { 
     case 0: 
      something.Help = expressionAsString; 
      break; 

     case 1: 
      something.Description = expressionAsString; 
      break; 
    } 
} 

這就是說,作爲Servy提到的警告是警告 - 如果你的代碼更容易理解多播和不顯著影響性能(只能通過確定嘗試兩種方式並測量差異),然後忽略或抑制警告。我已經看到太多難以理解的難以理解的代碼,以避免不了解代碼的上下文的警告

+0

感謝您只回答我的問題。 – 2015-04-16 10:07:12