2010-04-01 2 views
4

로 전 C#에 대한 객체를 캐스팅하기위한 더 좋은 방법이 무엇인지 궁금 해서요 :(MyClassName) 객체는 MyClassName

MyClassName test = (MyClassName)object; 

MyClassName test = object as MyClassName; 

난 당신이 첫 번째 방법을 할 경우, 당신은 예외가 있음을 이미 알고 있으며, 두 번째 방법은 null로 테스트를 설정합니다. 그러나, 나는 왜 다른 하나 이상 궁금 해서요? 그 일의 '더 나은 방법'이없는 경우 하나의 방법을 사용하기위한 지침 무엇인가 ...

나는 첫 번째 방법을 많이 볼 수 있지만 그때가 null을 확인할 수 있기 때문에 두 번째 방법을 좋아한다 또는 다른? 여기

답변

8

하지 공식적인 가이드 라인,하지만 내가 그것을 할 거라고 방법입니다.

인 경우 (예 : 객체가 결코 MyClassName과 다른 유형이 될 수 없다고 생각하는 경우), 명시 적 형변환을 사용하십시오. 예 (윈폼은) :

private void checkbox_CheckedChanged(object sender, EventArgs e) { 
    // We've hooked up this event only to CheckBox controls, so: 
    CheckBox checkbox = (CheckBox)sender; 
    // ... 
} 

MyClassName 정상적으로하지 않은 유형을 처리하는 경우

as 키워드를 사용합니다. as 운영자가 실패하지만 대신 null와 변수를 채우고 때 예외가 발생하지 않기 때문에이 은 다음과 같습니다

0

음, (캐스팅을 통해 사용하여 브래킷을)를 as 키워드를 사용하는 간단한 이유가 . 값이 null인지 확인하십시오. 코드가 작동하는지 여부는 입니다. 사용자가 잘못된 DLL의 종류, 또는 에 대한 액세스 권한을 선택 거부하거나 넣다 현실 세계에서 당신이 의 전체 블록 주위에 예외 처리를 원하는 것

주 ... 음, 당신이 얻을 사진. 이것은 당신이 자유롭게 사용 브래킷 캐스팅 할 수 있다는 것을 의미합니다 -하지만이 의 더 우아한 방법이 성공 또는 실패 여부를 을 알고 싶은 뭔가를하고 내 의견 입니다.

출처 : as 키워드를 사용하여이 http://www.nullify.net/Article/181.aspx

0

당신이 말한대로 안전하고, 당신이 캐스팅하려는 객체의 유형을 잘 100 %를하지 않은 경우에 사용하는 것입니다. 반대로 캐스트가 실패 할 경우 예외를 원하면 (cast) 메서드를 사용하십시오. 그러나 is도 사용하는 경우 as은 중복됩니다. 예를 들어, 다음 코드는 매우 일반적이다 : 당신이 객체가 MyClassName 것을 알고 있다면, 첫 번째 방법 (직접 캐스트)를 사용

MyClass mc; 

if (someObject is MyClass) 
{ 
    mc = (MyClass)someObject; 
} 
+1

2 가지 경우에만 한 가지 유형의 검사 만 수행하므로이 상황에서와 같이 사용합니다. –

+0

'if (someObject is MyClass)'에 실제로 생성 된 코드는 실제로'if ((someObject as MyClass)! = null)' –

+0

** **'is'와'(cast) '구문을 사용하면 유형 검사 비용이 두 번 발생합니다. 'is'를 사용하여 타입을 이미 확인했다면'as'를 사용하여 캐스트를 수행하는 것이 안전하고 암시 적 변환 검사를 무시할 수 있기 때문에 훨씬 빠릅니다. –

0

. 당신이 확실하지 않은 경우, 다음 두 번째 방법을 사용하여 널 (null)를 확인하거나 직접 주조하기 전에 is를 사용하여 유형 확인 : as은 참조 유형 작동

if (obj is MyClassName) 
{ 
    MyClassName test = (MyClassName)obj; 
} 
+0

** **'is'와'(cast)'구문을 모두 사용하지 마십시오. 유형 검사 비용이 두 번 발생합니다. 'is'를 사용하여 타입을 이미 확인했다면'as'를 사용하여 캐스트를 수행하는 것이 안전하고 암시 적 변환 검사를 무시할 수 있기 때문에 훨씬 빠릅니다. –

+1

당신 말이 맞아요 : http://stackoverflow.com/questions/496096/casting-vs-using-the-as-keyword-in-the-clr. 내가 'as'와 가진 유일한 문제는 캐스트가 실패하고 null을 확인하는 것을 잊었을 때 런타임 오류라는 것입니다. 캐스팅하기 전에 'is'로 테스트하면이를 방지 할 수 있습니다. 그리고 루프에서 수백만 개의 캐스트를 수행하지 않는 한 실제 성능 차이가 있는지 의심 스럽습니다. –

1

참고. 값 유형을 unbox해야하는 경우 C 스타일 캐스트를 사용해야합니다.

0

체크 아웃이 Prefix-casting vs As-Casting

저자라는 접두사 캐스팅에 기사 "신뢰할 수있는 주조,"캐스팅과 같은 "빠른 캐스팅을."

그는 언제 각자를 사용해야하는지에 대한 몇 가지 좋은 예가 있으며, 빠른 것이 항상 더 좋은 이유는 아닙니다. 희망이 도움이!

+1

이 기사에서 언급 한 벤치 마크 테스트는 2004 년에 .NET Framework 및 C# 2.0의 버전 1에서 수행되었다는 점을 지적 할 가치가 있습니다. 주석을 보면 새 버전의 프레임 워크와 C# 컴파일러에서 차이점이 훨씬 더 흐려진다는 것을 알 수 있습니다. 원래의 벤치 마크에서도 두 가지 방법의 차이점은 백만 분의 캐스팅에 비해 매우 작습니다! 이것은 가장 명확한 것을 작성하고, 무의미한 마이크로 최적화로 귀찮게하지 않는 명확한 사례 인 것으로 보입니다. –

+0

좋은 점 그레이엄. 이 게시물 이후 기사를 보니 명시 적 캐스트가 실제로 null 체크가있는 캐스트와 같이 컴파일되었다고합니다. 귀하의 의견에 감사드립니다. 유일한 차이점은 null 값 또는 null 예외가 있는지 여부입니다. – Audie