2013-02-09 4 views
2

저는 다양한 런타임 유형의 컨트롤을 처리하는 코드를 작성할 때 공통된 런타임 유형 식별 패턴을 사용하고 있습니다. 나는 이것이 등의 연산자는 NULL을 반환하는 경우에 NULL 체크를 할 것을 피하기 위해 할NULL 검사를 피하는 C# 런타임 유형 식별을위한 간소화 된 방법?

if (ctrl is ControlTypeEtc) 
    (ctrl as ControlTypeEtc).SomeMethod(); 

: 여기에 패턴이다. 이 작업을 단일 작업으로 간소화 할 수있는 방법이 있습니까?

+0

null 체크와 함께 'as'를 사용하면 얻을 수있는 것처럼 간소화됩니다. –

+0

아래의 제안 사항을 참조하십시오. 전처리 기 사용 : – John

답변

4

단일 작업으로는이 작업을 수행 할 방법이 없습니다.

그러나 as을 사용하고 null을 확인하는 것은 코드 샘플 에서처럼 두 개가 아닌 하나의 사례가 있기 때문에 저렴합니다. 퍼펙트 방지

ControlTypeEtc ctrl2 = ctrl as ControlTypeEtc; 
if (ctrl2 != null) 
    ctrl2.SomeMethod(); 

(하나에 최적화 할 수 있지만 잘 모르겠어요) :

+0

이것은 하나의 캐스트를 수행 할뿐만 아니라 'ctrl'이 파생 된 상황을 처리하기 때문에 붙여 넣은 원본 코드 스 니펫보다 월등합니다. 'ControlTypeEtc'의 – Ameen

1

나는 그것이로 작성합니다.

또 다른 방법 :

try 
{ 
    ControlTypeEtc ctrl2 = (ControlTypeEtc)ctrl; 
    ctrl2.SomeMethod(); 
} 
catch (InvalidCastException e) 
{ 
} 
1

결론은 "큰 그림"당신은 당신이 그것에 대하여 코딩을 진행하기 전에 인스턴스가 null의 경우는 알아야한다. 그 단계를 둘러싼 지름길을 찾을 이유가 없습니다.

그렇다면 C# 3 이상을 사용하는 경우 코드의 기본 로직에서이 세부 정보를 "숨기"는 데 사용할 수있는 Extensions 메서드가 있습니다. 아래의 'SomeType'및 'SomeMethod'샘플과 'SomeMethodSafe'라는 확장 메서드를보십시오. 오류없이 Null 참조에서 'SomeMethodSafe'를 호출 할 수 있습니다.

집에서 시도하지 마십시오.

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SomeType s = null; 
      //s = new SomeType(); 
      // uncomment me to try it with an instance 

      s.SomeMethodSafe(); 

      Console.WriteLine("Done"); 
      Console.ReadLine(); 
     } 
    } 

    public class SomeType 
    { 
     public void SomeMethod() 
     { 
      Console.WriteLine("Success!"); 
     } 
    } 

    public static class SampleExtensions 
    { 
     public static void SomeMethodSafe(this SomeType t) 
     { 
      if (t != null) 
      { 
       t.SomeMethod(); 
      } 
     } 
    } 
}