2012-11-19 104 views
2

我需要知道在方法內部使用相同的輸入參數而不將它們分配給方法局部變量是一種好的做法。以下代碼塊可能更清楚地描述查詢的方式。在方法中使用輸入參數是一種很好的做法

選項1:輸入參數的方法

public int SumValues(List<int> pLValues) 
     { 
      int _sum = 0; 

      for (int i = 0; i < pLValues.Count; i++) 
      { 
       _sum = +pLValues[i]; 
      } 

      return _sum; 
     } 

選項2內使用:分配到一個局部變量和使用該方法的內部。

public int SumValues(List<int> pLValues) 
{ 
    int _sum = 0; 
    List<int> _lVal = pLValues; 

    for (int i = 0; i < _lVal.Count; i++) 
    { 
     _sum = +_lVal[i]; 
    } 

    return _sum; 
} 

請告訴我什麼是最好的方法,爲什麼?

+1

您應該考慮查看C#命名約定。 – asawyer

+4

您的功能也不起作用。'SumValues(新列表(){1,1})''返回'1'而不是'2'它應該是'_sum + = _lVal [i];' – asawyer

回答

7

聲明另一個局部變量沒有好處,所以不要這樣做。 (將參數看作只是作爲一個局部變量,它是絕對分配入手的。)

如果你有一個ref參數,你不想改變數值,然後將使意義複製無可否認,它變成了一個新的局部變量。同樣,如果您以後需要原始值,當然。

有各種變化我使你的代碼,但是:

  • 我會使用LINQ的Sum法來開始上課:)
  • 我會溝,前綴你」已經得到了你的變量
  • 我可能會改變輸入類型IEnumerable<int>
  • 我會使用,而不是由指數
  • 取出一個 foreach循環
+0

只要它不被重新分配方法。保留新實例的變量。 –

+1

@JeffMercado:說實話,我不確定你的意思。 –

+0

我正在尋找很多遺留代碼,他們做了很多。變量被重複使用了很多次(完全不同的用途很多次),這使我變得瘋狂。 :)一個變量應該爲每個不同的用途聲明是我所說的。 –

3

這與您的情況完全相同_lValpLValues是相同的對象。

C#使用引用語義。也就是說,當你做

_lVal = pLValues; 

就表示_lVal是相同的對象pLValues和您所做的對象引用由_lVal將通過pLValues可觀察到的任何變化的參考。

_lVal.Add(int.MaxValue); 
if(pLValues.Last() == int.MaxValue){ 
    //this will be true because the element added in the first line 
    //is added to the object that both _lVal and pLValues references 
} 

在參數的類型是一個值類型(如int)的情況下也沒關係,但任一其他原因。由於任何賦值都是複製賦值,並且參數存在於傳遞給方法調用的副本中。副本的範圍與方法相同(在一般情況下,存在奇怪的情況,例如關閉參數)。

所以最後的答案是簡短的。你可能不會創建一個局部變量,因爲你只獲得了寬鬆的可讀性,因爲它現在不明顯,當使用該參數時

+0

我不會談論這樣的別名 - 兩個變量是* not *別名,它們只是具有相同的值。對'_lVal'本身進行更改*不會在'pLValues'中顯示,而如果您在對象內對「_lVal」的值所引用的數據*進行了更改,則該更改將可見你訪問該對象。 –

+0

是@JonSkeet你是對的他們是兩個不同的參考。我將更新 –

+0

如果我們將引用數據類型列表從原始列表中分離出來,該怎麼辦? – user1249197

相關問題