C # 메서드에서 반환 변수 선언 및 값을 직접 반환


17

반환 변수에 대한 토론에서 팀의 일부 구성원은 결과를 호출자에게 직접 반환하는 방법을 선호하는 반면 다른 구성원은 반환 변수를 선언하여 호출자에게 반환하는 것을 선호합니다 (아래 코드 예 참조)

후자의 주장은 코드를 디버깅하는 개발자가 메소드를 호출자에게 리턴하기 전에 메소드의 리턴 값을 찾도록하여 코드를 이해하기 쉽게 만든다는 것입니다. 이는 특히 메소드 호출이 데이지 체인 방식 인 경우에 해당됩니다.

어느 것이 가장 효율적이고 /하거나 어떤 스타일을 다른 스타일로 채택해야하는지에 대한 다른 지침이 있습니까?

감사

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }

11
두 예제 모두 동일한 IL로 컴파일됩니다. 두 번째 예를 원하는 유일한 이유는 디버깅 목적으로 또는 result반환하기 전에 사용해야 하는 경우입니다.
ChrisF

1
또 다른 이유는 결과 계산과 반환 사이에 다른 작업이 필요하기 때문입니다.
tdammers 2016 년

1
@ChrisF, 실제로 그들은 나를 위해 동일한 IL로 컴파일하지 않습니다 (추가 버전 stloc.0ldloc.0두 번째 버전이 있습니다). 그러나 나는 그것이 디버그 모드에서만 발생한다고 생각합니다. 그리고 어쨌든 여기서는 중요하지 않습니다.
svick

@svick - OK - 나는 "릴리스 모드에서"추가한다)
ChrisF

1
당신은 외모 같은 것을해야한다 (간결성을 위해) 쓰기 뭔가 때로는 수 있고 가입일 : a = b = c;그리고 a == b == c, 내가 뭔가를 쓰는 피할 것이다 그 모습처럼 a = b == c할 수 있다면. 그런 코드를 처음 보았을 때 무슨 일이 일어나고 있는지 알아내는 데 몇 초가 걸렸습니다. 그 코드는 눈에 띄었다. 괄호를 감싸고 a == 3싶지만 StyleCop은 그것을 좋아하지 않습니다. 버전 번호 1을 사용하는 좋은 이유입니다. 다른 것 : 이것은 본질적으로와 같은 람다 a => (a == 3)입니다. 이미 부풀린 사소한 함수에 코드 줄을 추가하는 이유는 무엇입니까?
Job

답변:


7

Visual Studio에서 Resharper를 사용하기 때문에 Ctrl-RV (또는 Resharper / IntelliJ 키 바인딩을 사용하는 경우 Ctrl-Alt-V)는 첫 번째 예제를 두 번째 예제로 바꿉니다. 그래서 디버깅하고 싶을 때 쉽게 할 수 있습니다. 그리고 다시 넣는 것을 잊어 버린 경우 Ctrl-RI가 다시 쉽게 읽을 수 있도록 다시 넣을 것이기 때문에 나쁘지 않습니다.

진지하게, 더 중요한 것들에 대해 논쟁하면서 시간을 낭비하십시오. 선행 중괄호 또는 공백 대 탭을 넣을 위치와 같습니다.


5
나는 보이지 않는 캐릭터에 대한 토론을 선호합니다 ...
ChaosPandion

좋은 팁, 여러분! 이제 우리는 이전보다 훨씬 빠르게 서로의 코드를 계속 리팩토링 할 수 있습니다. 실제로 논의하는 것보다 더 많은 시간을 절약 할 수 있습니다! :)
pb01

@pdr ctrl + RV는 resharper에서만 작동합니까? 아니면 일종의 사용자 정의 키 바인드입니까? 그것은 나를 위해 작동하지 않습니다.
Jane Doe

@JaneDoe : 나는 그것이 Resharper 리팩토링이고 VS에 동등한 것이 없다는 것을 알게되어 기뻤습니다. 답변이 수정되었습니다. 미안합니다.
pdr

승리를위한 @ChaosPandion U + 200B!
Jesse C. Slicer

20

개인적으로 첫 번째 예제를 더 쉽게 읽을 수 있습니다. return 문에 중단 점을 설정 a == 2하고 조사 식 창에 추가 하거나 빠른 감시를 사용하여 디버깅 할 수 있습니다 .

그러나 이것은 실제로 개인 취향의 문제입니다. 두 버전 모두 정상입니다.


8
+1 코드를 읽기가 더 어려워 브레이크 포인트를 쉽게 배치하는 것은 imho
jk

때때로식이 스레드를 실행해야하므로 감시 창 또는 중간 창이 항상이 문제에 대한 해결책은 아닙니다.
JustAnotherUserYouMayKnowOrNot 또는

@JustAnotherUserYouMayKnowOrNot : 예. 중단 점 내에서 디버그 창으로 메시지를 인쇄 할 수도 있습니다. 중단 점을 마우스 오른쪽 단추로 클릭하고 "히트시 ..."를 선택하십시오.
Olivier Jacot-Descombes

또한 표현식에 부작용이있을 수 있으므로 다시 실행하면 문제가 발생할 수 있습니다. 결과 var에 더 잘 붙습니다.
JustAnotherUserYouMayKnowOrNot 또는

1
디버거가 왜 이미 리턴 위로 마우스를 가져갈 때 값을 볼 수 없습니까? 스택에있는 것 같습니다.
candied_orange

10

코드를 예제처럼 쉽게 읽을 수 있으면와 같은 논리 연산의 결과를 반환하는 데 아무런 문제가 없습니다 return a == 2. 그러나 반환 값이 더 복잡한 문이거나 다음과 같은 경우

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

그런 다음 변수를 사용하여 해당 부분을 먼저 저장하고 가독성을 위해 return 문을 단순화하려고합니다.


2

이와 같은 간단한 예에서 어느 쪽이든 괜찮습니다.

더 복잡한 예제의 경우 두 번째 방법을 선호합니다. 그것은 더 읽기 쉽기 때문에 다른 사람들은 코드를 유지해야 할 것입니다.


보다 나은 변수 이름이있는 경우에만 result그 자체가 완전히 설명 적이 지 않고 쓸모없는 식별자입니다.
알렉산더-복원 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.