2012-04-03 1 views
6

전적으로 범위 관리를 위해 using 문을 사용하고 싶습니다. IDisposable을 구현하는 기본 객체에 대한 명시적인 참조를 생략 할 수 있습니까?RHV (right hand value)와 함께 using 문을 사용할 수 있습니까?

class ITransactionScope : IDisposable {} 
class TransactionGuard : ITransactionScope {...} 

class DbContext 
{ 
    public IDisposable ITransactionScope() 
    { 
     return new TransactionGuard(); 
    } 
} 

나는 다음을 수행 할 수 있습니다 :

void main() 
{ 
    var dbContext = new DbContext(); 

    using (dbContext.TransactionScope()) 
    { 
     // the guard is not accessed here 
    } 
} 

using 문 중 TransactionGuard 예를 살아이 declaraions을주는 예를 들어

?

+0

시도해 볼 수 있습니다. 리턴 된 스코프 인스턴스의'Dispose()'메소드에 중단 점을 설정하고 그것이 호출되는지 확인하십시오. – linuxuser27

+0

나는 같은 전략을 사용하고 있기 때문에 정말로 할 수 있기를 바란다. :) –

+3

당신이 신경 쓰는 것이 범위 관리이면, (중괄호를'using'없이) 코드에 넣을 수 없다. 코드 내부의 범위? –

답변

10

전적으로 범위 관리를 위해 using 문을 사용하고 싶습니다.

using 진술 내용은 적시에 관리되지 않는 리소스를 처리하기위한 것입니다. 그것이 당신이 using을 사용하고있는 것이 아니라면, 당신은 아마 뭔가 잘못하고있는 것입니다.

IDisposable을 구현하는 기본 개체에 대한 명시 적 참조를 생략 할 수 있습니까?

또 다른 대답으로 지적했듯이 : 이미 코드를 입력했습니다. 당신은 간단하게 그것을 시도 할 수 있었다.

네, 그렇게 할 수 있습니다. 컴파일러는 보이지 않는 지역 변수를 생성하고 Dispose을 호출합니다.

using의 사용법에 대해 궁금한 점이 있으면 C# 4 사양의 섹션 8.13을 읽는 것이 좋습니다.

+0

내 대답 좀 봐주실 수 있습니까? GC가 그것을 회수하지 않겠습니까? – Aliostad

+0

@Aliostad : C# 명세에서는'using (expr) s; '은'X temp = expr; 시도 {s; } finally {if (temp! = null) ((IDisposable) temp) .Dispose();}'. 쓰레기 수집기가'Dispose' 호출 전에 temp *를 정리할 것이라고 주장합니까? –

+0

@Eric 아마 C# 기능 악용에 대해 MVC 팀과 이야기 할 수 있습니다. ;) 나는이 것을 꺼리지 않는다. 그것은 편리한 문법이고, 리플렉션을 사용하지 않습니다. –

2

처분 할 때까지 살아 있습니다. 그래, 네.

이 질문은 컴파일 및 실행 버튼을 눌러 대답하는 것이 훨씬 쉽습니다. 이미 코드를 입력하셨습니다. 시도 해봐.

+1

-1. 이것은 반드시 사실 일 필요는 없습니다. 시도해 볼 수는 있지만 100 번 작동하지만 마지막 시간은 아닙니다. – Aliostad

+5

@Aliostad : 나는 당신을 따라 가지 않을 것이다. 비판은 전적으로 보증된다. 그 질문은 단순히 문서를 읽은 다음 시도해 보는 것만으로 쉽게 해결할 수있었습니다. using 문이 100 번 연속으로 작동 한 다음 실패하는 프로그램의 예를 들어 주시겠습니까? –

+0

@EricLippert 요점은 GC가'statement '를 사용하기 전에 그것을 회수 할 수 있다는 것이 었습니다. 따라서 제 대답은 당신이 그것을 검토 할 수 있다면 감사 할 것입니다. – Aliostad

관련 문제