[C#]int.TryParse out 변수에서 배우기

5669 단어 .NETFrameworkC#.NET
필자의 부끄러운 실패담을 드러내는 엔트리입니다.
우선 여기를 참조하십시오.

문제



이 때 isInt와 tmp가 콘솔에 출력하는 값은 무엇입니까?
using System;

public class Hello
{
  public static void Main()
  {
    int tmp = 10;
    bool isInt = Int32.TryParse("six", out tmp);
    Console.WriteLine(isInt);
    Console.WriteLine(tmp);
  }
}

정답




변수
출력되는 값


isInt
false

tmp
0


그런 것은 당연하다는 현명한 여러분은 특히 이 기사에서 얻는 것이 없기 때문에 부드럽게 탭을 닫아 주세요.

오답



그래서, 그런 것은 당연하지 않았던 필자의 부끄러움 오답은 이쪽.


변수
출력되는 값


isInt
false

tmp
10


isInt 가 false 가 되는 것은 기대대로입니다만, 문제가 out 변수로 지정하고 있던 tmp 로, 이쪽은 10 이 출력된다고 생각했습니다. 수치로 변환할 수 없는 값을 건네준 경우라도 out 에 대입은 되는군요. 그래서 tmp 에 미리 10 을 격납해 두어도 전혀 의미가 없다고 하는 것입니다.

공식




변환에 실패했을 경우는 0 을 포함합니다.

제대로 쓰여졌습니다. 여러분, 공식 문서를 잘 읽어 봅시다 (부메랑)

그런데 0은 언제 저장됩니까?



조금 신경이 쓰였으므로 가볍게 소스를 봐 보기로 했습니다.
이 기사를 참고로 했습니다.
htps : // 코 m / 마리 모이 / ms / 에 255 에 c265cd5 아 45025
int 는 말할 필요도 없이 System.Int32 의 별칭입니다.
그래서 이번 보고 싶은 것은 System.Int32 클래스의 문서가 됩니다. 바로 살펴보겠습니다.
htps : // / cs. mic로소 ft. 코 m / 쟈 jp / t t t / c 샤 rp / 뻬구 아게 레후 렌세 / 펭 구 아게 s 페시 후 카치 온 / 티 페 s # 시 mp 페 티 페스

System.Int32.TryParse



실제로는 Number.TryParseInt32 가 실질적인 처리를 실시하고 있는 것 같네요. 그래서 다음으로 진행합니다.

System.Number.TryParseInt32



htps : / / 레후 렌세 그렇게 r하라. mic로소 ft. 이 m/#ms 이 rぃb/sys m/누 m베r. cs, 958cb8bc00d00 아 94
메소드도 그렇습니다만, Number 클래스 자체도 internal 이기 때문에, 기본은 프로그래머가 호출해 사용하는 것 같은 클래스는 아닌 것 같네요. 그래서, 문제의 out 인수에의 대입은 메소드 개시로부터 3행째로 빨리 행해지고 있는 것을 알 수 있습니다.

mscorlib/system/number.cs,1085
result = 0

안의 구현까지 보지 않아도 메소드의 거동으로부터 분명합니다만, out 을 붙인 인수는 참조 건네받습니다.
그래서 이 대입에 의해 방금전의 문제의 tmp = 10 가 재기록되고 있는 것은 틀림없을 것 같습니다.

추가



@albireo씨로부터의 코멘트를 참고로, out 인수를 가지는 메소드를 자작해 확인해 보았는데, 원래 out 인수에 대해서 메소드내에서 아무것도 값을 대입하지 않으면 컴파일 에러가 되는 것을 알 수 있었습니다 했다. 적어도 out 인수가 어떠한 재기록이 행해지고 있는 것은 확실하다고 말할 수 있습니다.
void hoge(ref int refValue, out int outValue)
{
  //これはOK
  if (refValue < 0) {
    refValue = 0;
  }

  if (outValue < 0) { //後述のエラー1
    outValue = 0;
    Console.WriteLine(outValue);//これはエラーにならない
  }

  //後述のエラー2
}

VisualStudio 콘솔
エラー1
  割り当てのない out パラメーター 'outValue' の使用です。
エラー2
  out パラメーター 'outValue' はコントロールが現在のメソッドを抜ける前に
  割り当てられる必要があります。

이제 더 이상 같은 실패는 반복되지 않을 것입니다 w
끝까지 읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기