차이점이 있다면 다음과 같은 두 가지 방식의 차이점은 무엇입니까?캐스팅과 C#의 "as"사용의 차이점은 무엇입니까?
이 경우 e
은 GridViewRowEventArgs
개체입니다.
GridView gv = (GridView)e.Row.FindControl("gv"); //first way
GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
차이점이 있다면 다음과 같은 두 가지 방식의 차이점은 무엇입니까?캐스팅과 C#의 "as"사용의 차이점은 무엇입니까?
이 경우 e
은 GridViewRowEventArgs
개체입니다.
GridView gv = (GridView)e.Row.FindControl("gv"); //first way
GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
의 차이점은 다음과 같습니다 캐스트가 실패
InvalidCastException
가 발생합니다.as
연산자가 실패하면 null 참조 만 반환합니다.as
은 nullable 값 유형과 함께 사용할 수 없습니다 (예 : "o as int
"을 사용할 수 없음).as
은 nullable 값 유형에 대해 unbox하는 데 사용할 수 있습니다.)EDIT : 어떤 연산자를 사용하는 것이 적절하다고 생각하면 대략 written elsewhere입니다. 읽는 가치가있을 수 있습니다 ...
그러나 참조 유형을 사용하면 테이블에 첫 번째 것은 InvalidCastException을 발생시키고 테이블에 할당 할 수없는 경우에는 두 번째가 null을 반환합니다.
일반적으로 정적 캐스트와 "as"의 차이점은 캐스트가 실패 할 경우 Exception을 던지는 반면 "as"는 변수를 null로 설정한다는 것입니다.
"as"문은 기본적으로 변수를 캐스팅하려고 시도하고 예외를 throw하지 않고 실패하면 null을 반환합니다. 따라서 사용자가 캐스팅하는 값은 null 허용 가능 유형 (참조 유형 또는 null 가능 프리미티브)이어야합니다. 귀하의 예에서는 다음을 수행해야합니다.
int? i2 = o as int;
또는 컴파일하지 않아야합니다.
안전한 캐스트
variable as type
등은
(variable is type) ? (type)variable : (type)null
과 동일한을 수행하고 값 유형에 대해 작동하지 않습니다.
Jon이 지적한 문제 외에도 as
키워드는 o
을 효과적으로 SomeClass
으로 캐스팅합니다. o
이 SomeClass
에서 파생되지 않은 경우 null
을 반환합니다. 반면에 간단한 캐스트는 예외를 던질 것입니다. 왜 당신이 변환을 수행하고, (더 중요한) 무엇 변환 후 라인에서 발생 -
SomeClass i2 = o as SomeClass;
위의 답변에서 언급되지 않은 어떤
SomeClass i2;
if (o is SomeClass)
i2 = (SomeClass)o;
else
i2 = null;
이 의도입니다된다 ?
:
if ((foo as SomeType).SomeMethod()) { /* ... */ }
이이 캐스트 - 사용 버전에 비교 될 수있다 :
예를 들어, 나는 시간의 다음과 같은 다수의 유사한 코드를 본 적이
if (((SomeType) foo).SomeMethod()) { /* ... */ }
그럼 어느 것이 더 낫지?
캐스트입니다.
as
을 사용하면 변환에 실패하면 NullReferenceException
이됩니다.
변환을 실패하면 캐스트를 사용하면 InvalidCastException
이됩니다.
이제는 디버깅에 더 유용한 예외입니까? 거의 모든 것으로 제작 될 수있는 NullReferenceException
또는 실제로 잘못 된 것이 무엇인지 알 수있는 InvalidCastException
? 따라서
, 만 사용 as
변환이 경우 실제로 옵션 (는 변수를 사용하기 전에 null
검사가 있어야한다는 것을 의미). 그렇지 않으면 캐스트를 사용하여 의도를보다 분명하게 만듭니다.
내가 여기에 분명히 표시되어있을 수도 있지만 'as'캐스트를 사용하면 얻을 수있는 것 중 하나는 요청한 유형의 개체로 끝나게된다는 것입니다. 이것은 특정 상황에서 유용합니다.
Jon을 참조 유형으로 업데이트하겠습니다. – Xaisoft
별로 필요하지 않습니다 - 지금 내 답변에 더 많은 설명했습니다 :) –
정말 고마워, 실제로 GridView로 업데이 트했는데, 당신의 대답은 충분히 좋다. – Xaisoft