[c#] {} 문을 사용하여 내부에서 return을 호출하는 것이 좋은 방법입니까?

블록 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()방법도 마찬가지입니다 .



답변

return내부 를 호출하는 것은 완벽하게 안전 합니다.usingusing 블록은 블록 일 뿐이므로 블록try/finally .

위의 예에서 return 후 true범위가 삭제되고 값이 반환됩니다. return false, 그리고 scope.Complete()의지 하지 전화 . Dispose그러나 finally 블록 안에 있으므로 관계없이 호출됩니다.

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

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가 내부에서 수행하는 작업)은 범위가 남아있을 때 항상 실행됩니다.

그러나 이것은 finally 블록에있는 문에만 해당됩니다 (를 사용할 때 명시 적으로 설정할 수 없음 using). 따라서 귀하의 예제에서는 scope.Complete()호출되지 않습니다 (컴파일러가 도달 할 수없는 코드에 대해 경고 할 것으로 예상합니다).


답변

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

따라서이 샘플에서는 Complete ()가 호출되지 않고 범위가 IDisposable 인터페이스를 상속한다고 가정하여 삭제됩니다.


답변

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

return그 자체에 관해서 는-예, 내부 using진술 이라고 부르는 것이 안전 합니다. 사용은 씬 뒤에서 try-finally 블록으로 번역되고 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가 집을 수없는 물건이 없으면 문제 없습니다.