{} 문을 사용하여 내부에서 반환을 호출하는 것이 좋은 방법입니까?
블록 return
내부 를 호출 하는 것이 안전하고 좋은 접근 방식인지 알고 싶습니다 using
.
예를 들어.
using(var scope = new TransactionScope())
{
// my core logic
return true; // if condition met else
return false;
scope.Complete();
}
는 마지막에 우리 추론 중괄호 dispose()
가 호출된다는 것을 알고 있습니다. 그러나 위의 경우 return
에는 제어가 주어진 범위 (AFAIK)에서 벗어나기 때문에 ...
- 내 전화
scope.Complete()
가 왔나요? - 스코프의
dispose()
방법도 마찬가지입니다 .
using 블록은 블록 일뿐 아니라 블록 return
내부 를 호출하는 것은 완벽하게 안전합니다 .using
try/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가 집을 수없는 물건이 없으면 문제 없습니다.
'IT' 카테고리의 다른 글
assetic : dump와 assets : 설치의 차이점 (0) | 2020.10.08 |
---|---|
Rx Observable에서 어떻게 ʻawait` 할 수 있습니까? (0) | 2020.10.08 |
Multiprocessing Queue, Pool 및 Locking을 사용하는 단순한 예 (0) | 2020.10.08 |
셀에서 복사 할 때 따옴표를 생략 (0) | 2020.10.08 |
Kotlin : 공개 get private set var (0) | 2020.10.08 |