2012-08-30 2 views
1

가능한 중복 :
Casting vs using the 'as' keyword in the CLR
C#: “is” vs “as”"as"또는 "is"를 사용하는 것이 더 나은 코드는 무엇입니까?

이 코드 :

if (sheet.Models.Data is GroupDataModel) 
    { 
     GroupDataModel gdm = (GroupDataModel)sheet.Models.Data; 

이 코드 :

GroupDataModel gdm = sheet.Models.Data as GroupDataModel; 
    if (gdm != null) 
    { 

위의 두 가지 스타일 중 하나를 다른 스타일보다 추천 하시겠습니까?

+0

첫 번째. 캐스팅이 불가능한 경우 두 번째 예외가 throw 될 수 있습니다. –

+2

'더 나은'정의 - 무엇을 의미합니까? 공연? 가독성? 오류? 다른 것? – Oded

+0

처음에는 프로그램에 null 기호를 삽입하지 않는 이점이 있습니다. – antlersoft

답변

3

난 당신이 체크 할 수있는만큼 잘 변환 때문에 같이 갈 수는 더 좋은 생각은 쉽게 하나가 이것에 대해

더 좋은 ..second : 같은 사이 Explicit and Implicit Casting of object and Role of 'is' and 'as' keyword in Explicit casting

차이와

입니다
  • 같이 연산자는 한 형식에서 다른 형식으로 변환하고 변환 이 실패하면 Null을 반환합니다. 컨버터블이면 다시 변환 할 필요가 없습니다.

  • 은 날씨가 한 개체가 다른 유형으로 변환 가능한지 여부를 확인하고 그렇지 않은 경우 false를 반환합니다. 그래서 그것이 변환 가능한 경우 객체를 기본 유형으로 변환해야합니다. 주조 한 번만 수행 될 필요성

+2

캐스트를 수행하는 데 필요한 노력의 양은 극소값입니다. 확실히 마이크로 최적화입니다. 보다 읽기 쉬운 코드를 사용해야하며, 그렇지 않으면 논리적으로 더 이해하기 쉬운 코드를 사용해야합니다. 실적이 여기에 관련해서는 안됩니다. – Servy

5

후자는의 FxCop 제창되어합니다 (as)

1

번째 버전이 바람직하다.

두 번째 버전은 하나의 유형 테스트 만 필요합니다. 테스트가 성공하면 첫 번째 테스트에는 두 가지 형식 테스트가 필요합니다 (먼저 is에 대해 수행 한 후 다시 테스트합니다). 흥미롭게도

+0

캐스팅이 불가능하면 예외가 발생하지 않습니까? –

+0

@AndreCalil : 어느 버전도 예외를 throw하지 않습니다. –

+1

첫 번째 상황은 상황에 따라 다를 수 있습니다. 멀티 쓰레딩 상황에서,'sheet.Models.Data'는 형식 체크시에'GroupDataModel'로 변환 될 수 있지만 캐스트 될 때는 변환 될 수 없습니다. –

1

, 두 가지 버전이 경우 동일한 IL을 생산 :

코드 :

void Main() { 
    Class1 inst1 = new Class1(); 
    ((inst1 as Class1) != null).Dump(); 

    Class1 inst2 = new Class1(); 
    (inst2 is Class1).Dump(); 
} 

class Class1 { } 

IL을 :

IL_0001: newobj  UserQuery+Class1..ctor 
IL_0006: stloc.0  
IL_0007: ldloc.0  
IL_0008: ldnull  
IL_0009: ceq   
IL_000B: ldc.i4.0  
IL_000C: ceq   
IL_000E: call  LINQPad.Extensions.Dump 
IL_0013: pop   
IL_0014: newobj  UserQuery+Class1..ctor 
IL_0019: stloc.1  
IL_001A: ldloc.1  
IL_001B: ldnull  
IL_001C: ceq   
IL_001E: ldc.i4.0  
IL_001F: ceq   
IL_0021: call  LINQPad.Extensions.Dump 

Class1..ctor: 
IL_0000: ldarg.0  
IL_0001: call  System.Object..ctor 
IL_0006: ret 
+2

'is'는 'as'로 구현됩니다 (http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is.aspx). '((bar as Foo)! = null)'은 당신이 시연하는'(bar is Foo)'와 분명히 동일합니다 – 3Doubloons

1

당신이 형식화를 사용하려는 경우 나중에 "as"을 사용하십시오.

유형 자체로 개체를 사용하지 않으려면 "is"을 사용하십시오.

이러한 개체를 특정 유형으로 지정하면 또 다른 문제가 있습니다. 그런 다음 캐스트를 사용하고 유형이 예상 한 것과 다르면 예외를 발생 시키십시오.

관련 문제