2014-09-18 7 views
3

일부 코드를 디버깅 중이며이 이상한 시나리오를 발견했습니다. 방법은 String[] 변수를 소요하고 먼저 확인 변수가 우리는이 라인을 통과받을 ...String []. 이상한 결과를내는 Count()

protected override CommandResult OnExecute(DateTime closeOfBusinessDate, 
                   string[] verbs) 
     { 
      if (verbs == null) 
      { 
       throw new ArgumentNullException("verbs"); 
      } 

경우, 다음은 변수가 더 이상의 값이 있는지 확인하기 위해 그것을 확인 당신이 볼 수 있듯이 ...

if (verbs.Count() > 1) 
    { 
     throw new ArgumentException("Only single verb supported.", "verbs"); 
    } 

그것은 꽤 기본적인 것들, 그러나 디버깅하는 동안, 나는이 결과를보고하고 ... enter image description here

Count()입니다 , 아직 수표는 if (verbs.Count() > 1)에 대해 true로 평가됩니다. 누구든지 설명 할 수 있습니까? 어쩌면 나는 명백한 것을 놓치고 있을지도 모른다.

편집 : 추가 출력

당신은 출력 창에서 볼 수있는, 값은 1입니다.

enter image description here

+2

동사를 인쇄하십시오.count 문 앞에 if 문 –

+1

동사 배열을 올리시겠습니까? 감사 ! – Christos

+6

나는 이상한 행동에 대해 논평 할 수는 없지만, 그 방법이 정확히 하나의 동사를 필요로하는지 물어야한다. –

답변

-4

나는 당신이 그 결과를보고 왜 내가 당신에게 말할 수 있는지 모르겠지만, 수정을 제안 할 수 있습니다 : 대신 verbs.Count의 verbs.Length()를 사용합니다. 이 경우 Count()는 LINQ 메서드이고 Length는 배열의 항목 수를 알려주는 배열 속성입니다.

static void Example() 
    { 
     var verbs = new string[] { null, null }; 
     checkBerbs(verbs); 
    } 

    static void checkVerbs(string[] verbs) 
    { 
     if (verbs.Count() > 1) 
     { 
      mutateArray(ref verbs); //this would run another thread --> race condition 
      throw new ArgumentException(); 
     } 
    } 

    private static void mutateArray(ref string[] verbs) 
    { 
     verbs = new string[] { null }; 
    } 

이 가능한 시나리오 :

+1

이것은 'Count'가 잘못되었음을 의미합니까? -1 –

+0

분명히 Count()가 잘못된 답을주고 있습니다. Length보다 실행하는 코드가 더 비쌉니다. 정답입니다. 그래서 실용적인 문제로, Count()가 잘못되었습니다 ... –

0

는 다음과 같은 코드를 생각해 보자. 코드의 전체 범위를 알지 못해도 이것이 가능한지 확실하지 않습니다. 분명히 mutateArray은 다른 스레드에서 실행 중이며 경쟁 조건이 있습니다. 잠금 verbs을 사용하면이 문제에 대한 단서를 제공 할 수 있습니다.

+0

Example() 내부에 _mutate_ 배열이 있지만 매개 변수가 메서드 매개 변수로 전달 된 배열이있는 경우 (동일한 변수가 다른 메서드로 참조로 전달되는 경우 발생할 수 있습니다 ...) 첫 번째 방법으로 "받은"배열은 변경되지 않습니다. –

+0

예, 똑같습니다. checkVerbs()에서 mutateArray()를 호출하면 설명하는 내용이 적용될 수 있습니다.하지만 OP는이 경우 놀라지 않을 것입니다. ..). Example() 내에서 mutateArray()를 호출하면 checkVerbs()에 의해 수신 된 배열은 영향을받지 않습니다 –

+0

@AdrianoRepetti 그래, 맞습니다. – InBetween

0

실제로 코드가 Enumerable.Count 확장 메서드를 호출하고 트릭이 발생하지 않는다면 다음 문제는 throw 문이라고 가정합니다.

가 그렇지 않은 경우에도 하나 개의 위치에있을 나타나는 디버거가 발생할 가능성이 가장 높은 두 가지 상황은 다음과 같습니다

  1. 가 (매우 일반적인 활성화 최적화를 컴파일하며 릴리스의 기본을 구성).
  2. IL 재 작성 도구를 사용하여 디버깅 정보를 올바르게 업데이트하지 않습니다 (일반적이지는 않음).

다시 컴파일 또는 throw 문이 실제로 도달하지 있음을 보여 예상됩니다 디버그 구성을 사용하여 코드를 실행할 수 있습니다.

+0

+ 1000^0 명령이 실행되는지 아닌지 확인하기 위해 ... –

+0

@AdrianoRepetti 원래 질문이나 @christiandev의 의견도 그가 던져진 진술을 밟아서 실제로 던져지고 있는지를 확인하지 못했습니다. 테스트는 코드 최적화 설정을 사용하지 않고 실행되었습니다 (예 : ** 디버그 ** 구성). –

-1

카운트가 그렇게 작동하지 않습니다. 대신 verbs.Length을 사용하십시오.

관련 문제