2012-11-19 2 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})'은'2' 대신'1'을 반환합니다. _sum + = _lVal [i]; – asawyer

답변

7

다른 로컬 변수를 선언해도 이점이 없습니다. 그러니하지 마십시오. (다만 확실히 시작하는 할당 된 지역 변수가되는 등의 매개 변수를 생각하십시오.)

을 당신이 ref 매개 변수가 있고 값을 변경하지 않으면 복사 나을 다음 그것은 분명히 새로운 지역 변수에 포함됩니다. 마찬가지로 나중에 원래 값이 필요한 경우 마찬가지입니다.

그러나 나는 코드로 만들 것 다양한 변화가 있습니다 :

  • 나는 물론 :
  • 나는 도랑 것의와 접두사를 시작하는 LINQ의 Sum 방법을 사용하십시오 당신 ' 당신의 변수에 도착했습니다 것은
  • 나는 아마 내가 대신 인덱스
  • 페칭의 foreach 루프를 사용하십시오 IEnumerable<int>
  • 에 대한 입력 유형을 변경 것
+0

나중에 다시 할당되지 않는 한 방법. 새 인스턴스의 변수를 유지하십시오. –

+1

@JeffMercado : 솔직히 말해서, 무슨 뜻인지 모르겠습니다. –

+0

저는 많은 기존 코드를보고 있으며 많은 작업을 수행합니다. 변수가 많이 재사용되며 (완전히 다른 용도로 여러 번 사용됨) 나에게 많은 영향을줍니다. :) 변수의 모든 다른 사용하기 위해 선언 해야하는 건 내가 말하는거야. –

3

정확히 일치합니다. _lValpLValues과 동일한 개체입니다.

C#은 참조 의미 체계를 사용합니다. 당신은 당신이 _lValpLValues와 같은 객체 및 _lValpLValues을 통해 관찰 될 것입니다 의해 참조되는 객체에 대한 모든 변경 사항에 대한 참조가 없다는된다

_lVal = pLValues; 

을 할 때입니다. 그렇지 물질 중하지만 다른 이유로 않는 파라미터의 유형 (예 INT와 같은) 치형 인 경우

_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 
} 

이다

. 할당은 복사 할당이 될 것이고 인수는 메소드 호출에 전달 된 사본을위한 것입니다. 복사본의 범위는 메서드와 동일합니다 (일반적으로 인수를 둘러싸고 이상한 경우가 있습니다).

결국 짧은 대답은 다음과 같습니다. 매개 변수를 사용할 때 명확하지 않으므로 로컬 변수를 만들지 않을 수도 있습니다.

+0

두 변수는 * 별칭이 아니며 같은 값을 가지고 있습니다. '_lVal' 자체를 변경하는 것은'pLValues'에서 볼 수 없습니다. 반면에'_lVal'의 값이 *를 참조하는 객체 내에서 데이터를 변경하면 그 변화는 볼 수 있습니다. 당신은 객체에 접근한다. –

+0

그래 @ 존 키스 네가 맞다. 참조 데이터 형식 목록을 기본 목록과 별도로 전달하면 무엇을 –

+0

으로 업데이트할까요? – user1249197

관련 문제