IT

{} 문을 사용하여 내부에서 반환을 호출하는 것이 좋은 방법입니까?

lottoking 2020. 10. 8. 07:28

{} 문을 사용하여 내부에서 반환을 호출하는 것이 좋은 방법입니까?


블록 return내부 를 호출 하는 것이 안전하고 좋은 접근 방식인지 알고 싶습니다 using.

예를 들어.

using(var scope = new TransactionScope())
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}

는 마지막에 우리 추론 중괄호 dispose()가 호출된다는 것을 알고 있습니다. 그러나 위의 경우 return에는 제어가 주어진 범위 (AFAIK)에서 벗어나기 때문에 ...

  1. 내 전화 scope.Complete()가 왔나요?
  2. 스코프의 dispose()방법도 마찬가지입니다 .

using 블록은 블록 일뿐 아니라 블록 return내부 를 호출하는 것은 완벽하게 안전합니다 .usingtry/finally

위의 예에서 반환 후 true범위가 삭제되고 값이 반환됩니다. return false, 전화 scope.Complete()받지 않습니다 . Dispose그러나 마침내 블록 안에 있기 때문에 상관없이 호출됩니다.

코드는 기본적으로 다음과 동일합니다 (이해하기 쉽게 만들 수있는 경우).

var scope = new TransactionScope())
try
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}
finally
{
  if( scope != null) 
    ((IDisposable)scope).Dispose();
}

는 점에 거래가 유의하십시오 결코 갈 수있는 방법이 없기 때문에 커밋하지 scope.Complete()트랜잭션을 커밋 할 수 있습니다.


괜찮습니다. finally절 (절의 닫는 중괄호 using가 내부에서 수행하는 작업)은 항상 실행됩니다.

마지막으로 현재는 블록에있는 문에만 존재 using합니다. 귀하의 예제 따라서에서 scope.Complete()결코 호출되지 않을을 구석으로입니다 (컴파일러가 도달 할 수없는 코드에 대해 경고 할 것으로 예상합니다 ).


일반적으로 좋은 접근 방식입니다. 그러나 귀하의 경우를 호출하기 전에 돌아 오면 scope.Complete()TransactionScope를 폐기합니다. 디자인에 따라.

그러나 완전한 ()가 호출되지 않고 범위가 IDisposable 인터페이스를 상속 가정하여 삭제됩니다.


scope.Complete는 확실히 전에 호출되어야 return합니다. 컴파일러는 경고를 표시 하고이 코드는 호출되지 않습니다.

return그 자체에 내장 된는 -예, 내부 using이라고 부르는 것이 안전 합니다. 사용은 씬 뒤에서 try-finally 블록으로 번역되고 마침내 블록은 확실히 실행됩니다.


제공 한 예에 문제가 있습니다. scope.Complete()호출되지 않았습니다. 둘째, return문 안에 using을 사용하는 것은 좋은 습관이 아닙니다 . 다음을 참조하십시오.

using(var scope = new TransactionScope())
{
    //have some logic here
    return scope;      
}

이 간단한 예에서 요점은 다음과 가능합니다. scope문 사용이 완료되면 의 값은 null이됩니다.

따라서 문을 사용하여 내부로 반환하지 않는 것이 좋습니다.


scope.Complete()이 호출 광고 확인 try/finally. dispose당신이 그것을 포장이 있기 때문에 using대안입니다 try/finally.

using(var scope = new TransactionScope())
{
  try
  {
  // my core logic
  return true; // if condition met else
  return false;
  }
  finally
  {
   scope.Complete();
  }
}

이 예제에서 scope.Complete ()는 실행되지 않습니다. 그러나 return 명령은 스택에 할당 된 모든 항목을 정리합니다. GC는 참조되지 않은 모든 것을 처리합니다. 따라서 GC가 집을 수없는 물건이 없으면 문제 없습니다.

참고 URL : https://stackoverflow.com/questions/11776945/is-it-a-good-approach-to-call-return-inside-using-statement