문제

고려하다,

        static void Main(string[] args)
        {
            Console.WriteLine(fun());
        }

        static int fun()
        {
            int i = 0;
            try
            {
                i = 1;
                return i;
            }
            catch (Exception ex)
            {
                i = 2;
                return i;
            }
            finally
            {
                i = 3;
            }
        }

샘플 코드는 "1"을 출력합니다.그러나 finally 블록에서는 i의 값이 3으로 변경됩니다.왜 'i'의 값이 3으로 변경되지 않았나요?

감사합니다,

도움이 되었습니까?

해결책

이 코드를 고려하십시오. 코드는 당신이 생각하는 것을 설명하고 실제로 일어날 일을 실제로 할 수있는 방법을 설명한다고 생각합니다.

static void Main(string[] args)
{
    int counter = 0;
    Console.WriteLine(fun(ref counter)); // Prints 1
    Console.WriteLine(counter); // Prints 3
}        

static int fun(ref int counter)
{
  try
  {
      counter = 1;
      return counter;
  }
  finally
  {
      counter = 3;
  }
}

이 코드를 사용하면 메소드에서 1을 반환하지만 카운터 변수를 3으로 설정하여 메소드 외부에서 액세스 할 수 있습니다.

다른 팁

당신은 시도와 캐치에서 다른 모든 것을 실행한다는 것을 기억해야합니다. 시도/캐치/마침내 문 후에 반환 명령문을 배치하여 반환되도록하십시오.

값 유형 대신 참조 유형을 사용하면 다른 동작을 얻을 수 있다고 생각합니다.

"나를 돌려줘"라고 말했을 때...C#은 해당 반환 값을 임시 보유 영역(메모리)에 넣은 다음 '최종' 코드를 실행합니다.finally 블록이 해당 값을 수정할 수 있다면 finally 블록의 안전성/최종성을 무너뜨릴 것입니다.

내부에 return이 포함된 using 문과 같습니다."폐기"는 (말하자면) 반품 후에도 여전히 발생합니다.

마지막으로 항상 실행됩니다

예외가 발생하든 아니든 코드는 항상 최종적으로 실행됩니다. 그래서 당신의 코드는 실제로 다음과 같아야합니다.

try
{
    i = 1;
}
catch
{
    i = 2;
}
finally
{
    i = 3;
}
return i;

그러나이 사소한 사례에서 마침내 블록은 의미가 없습니다. 우리는 그 전에 무슨 일이 있었는지에 관계없이 항상 3을 돌려주기 때문입니다.

마지막으로 자원을 해제하는 데 사용됩니다

finally 블록은 일반적으로 할당 된 일부 시스템 리소스를 해제해야 할 때 일반적으로 사용해야합니다. try 블록 (예 : DB 연결 열기 try 차단하고 닫습니다 finally). 따라서 예외가 있든 없든 항상 석방 될 것입니다. 이 경우 사용하는 것은 의미가 없습니다. finally 차단하다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top