아래 코드를 linqpad로 실행하면

void Main()

{

           Test t = new Test();

    var y = t.aaa();

   

           System.Console.WriteLine(y);

}

 

class Test {

    public int aaa() {

        int x = 1;

 

        try {

            return (x += 1);

        } catch (Exception e) {

 

        } finally {

            x += 3;

        }

        return x;

    }

 }

 

출력은 2가 된다.

 

위 코드의 출처는 http://www.pixelstech.net/article/1474892842-try-%7B-return-%7D-finally-%7B%7D 이다

언어는 java를 대상으로 했지만 c#도 비슷한 것 같다.

 


출력이 2가 나오는 이유는 (java의 경우) 다음과 같다JVM 문서를 보면


만약 try 절에서 return을 실행할 경우 컴파일 된 코드는 다음과 같은 처리를 한다.

- 로컬 변수에 반환 값을(만일 존재하는 경우)을 저장한다.

- finally절 코드까지 jsr를 실행한다.

- finally절의 return에서 로컬 변수에 저장된 값을 반환한다.

 

return ++x가 실행되면 JVM++x의 값을 임시 변수에 저장하고, finally 블록을 계속 실행한다. finally가 실행된 뒤 임시 변수에 저장되어 있는 값을 메서드의 호출자에게 돌려준다.

 

저작자 표시
신고
by 흥배 2016.11.18 08:00