david's daily developer note

C# Using 문의 try/catch 확장 본문

[Develop] Language/C#

C# Using 문의 try/catch 확장

mouse-david 2011. 1. 3. 11:23
728x90

using 문의 try - catch 확장


using과 foreach 문을 사용하게 되면 IL 코드로 변환될 때 try/catch 구조로 변환된다. 예를 들어, C# 명세서 8.13 the using statement에 설명된 것을 보자.

using (ResourceType resource = expression) statement


C# 명세서에 따르면 위와 같은 코드에서 ResourceType이 값 타입(value type)이면 다음과 같은 형태로 변환된다.

{
   ResourceType resource = expression;
   try {
      statement;
   }
   finally {
      ((IDisposable)resource).Dispose();
   }
}

반면에, ResourceType이 참조 타입(reference type)이면 다음과 같다.

{
   ResourceType resource = expression;
   try {
      statement;
   }
   finally {
      if (resource != null) ((IDisposable)resource).Dispose();
   }
}

 

foreach문의 try/catch 확장


C# 명세 8.3.3 foreach statement를 살펴보면 foreach 문에서 사용하는 컬렉션에 따라 그 확장이 달라지게 된다.

foreach (ElementType element in collection)


이와 같은 코드가 있다고 할 때 컬렉션의 형식이 컬렉션 패턴을 구현하고 있다면 다음과 같이 확장된다.

Eenumerator = (collection).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      ElementType element = (ElementType)enumerator.Current;
      statement;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}


컬렉션 패턴을 구현하지 않고 IEnumerable을 구현하는 경우에 foreach 확장은 다음과 같이 된다.

IEnumerator enumerator = 
       ((System.Collections.IEnumerable)(collection)).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      ElementType element = (ElementType)enumerator.Current;
      statement;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}


저자: 한동훈(traxacun @ unitel.co.kr)

728x90