as
즉 as 를 사용하여 변환을 하였다면 그 값이 null 인지를 체크하여 제대로 변환 여부를 따져보면 됩니다. 또한 as 를 사용하기전 가능여부는 is 를 사용하여 확인하고 변환을 시도하면 됩니다.
여기서 참조 변환 과 boxing 변환이란 .....
is
반면 cast 경우를 살펴본다면 ...
데이터 손실이 있을경우 cast 에서는 InvalidCastException 을 발생시킵니다. 이 에러는 foreach 를 사용했을 경우도 내부 cast 연산을 사용하기때문에 같은 에러가 발생합니다.
좀더 자세히 본다면..
foreach 문은 cast 연산을 수행하므로 System.Object 를 collection 내에 존재하는 객체의 런타임 자료형으로 형변환할수 있는지 테스트하지 않는다. 단지 System.Object를 foreach 문 내에서 선언된 자료형으로 변환 할수 있는지만 테스트하게 된다.
즉 object 인 형태를 선언한 형태로 변형가능한지 여부만을 판단한다는 말.
as , is 와 cast 에 차이점.
1. as 와 is 연산자는 사용자가 정의한 형변환 연산자의 존재를 고려하지 않기 때문에 런타임의 수행성능 효율도 좋다. as 와 is 연산자는 런타임에 정확한 타입의 변환이 가능할 때에만 형변환을 수행한다. 또한 형변환을 수행하기 위해서 새로운 객체를 만들거나 하지 않는다.
2. 사용자가 정의한 형변환 연산자를 어떻게 다루는지.
as 나 is 연산자는 런타임에 객체의 형변환이 가능한지를 확인하기 위해서 사용자가 정의한 형변환 연산자를 전혀 고려하지 않는다. as 나 is를 이용하여 형변환을 시도하면 객체가 변환 요청된 타입이거나 변환 요청된 타입으로부터 상속된 타입이 아닌 경우 실패하게 된다.
cast 연산을 수행하는 코드를 사용하게 되면 컴파일러는 객체를 변환 요청된 타입으로 변경할 수 있는 다양한 형변환 연산자를 고려하여 형변환을 수행하는 코드를 만들어낸다.
as 연산자는 캐스트 연산과 비슷하지만 변환이 가능하지 않은 경우에 as를 사용하면 예외가 발생하지 않고 대신 null이 반환됩니다.
as 연산자는 오직 참조 변환과 boxing 변환만을 수행합니다
as 연산자는 오직 참조 변환과 boxing 변환만을 수행합니다
출처 : msdn.microsoft.com
즉 as 를 사용하여 변환을 하였다면 그 값이 null 인지를 체크하여 제대로 변환 여부를 따져보면 됩니다. 또한 as 를 사용하기전 가능여부는 is 를 사용하여 확인하고 변환을 시도하면 됩니다.
여기서 참조 변환 과 boxing 변환이란 .....
boxing은 값 형식을 object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 프로세스입니다.
int i = 123;
object o = (object)i; // boxing
int i = 123;
object o = (object)i; // boxing
출처 : msdn.microsoft.com
is
지정된 형식과 개체가 호환되는지 검사합니다. 예를 들어, 다음과 같이 개체가 string 형식과 호환되는지 확인할 수 있습니다.
if (obj is string)
{
}
if (obj is string)
{
}
출처 : msdn.microsoft.com
반면 cast 경우를 살펴본다면 ...
명시적 변환(캐스트): 명시적 변환에는 캐스트 연산자가 필요합니다. 이 경우 소스 및 대상 변수가 호환되지만 대상 변수의 형식이 소스 변수보다 작은 경우(또는 소스 변수의 기본 클래스인 경우) 데이터가 손실될 위험이 있습니다.
출처 : msdn.microsoft.com
데이터 손실이 있을경우 cast 에서는 InvalidCastException 을 발생시킵니다. 이 에러는 foreach 를 사용했을 경우도 내부 cast 연산을 사용하기때문에 같은 에러가 발생합니다.
좀더 자세히 본다면..
foreach 문은 cast 연산을 수행하므로 System.Object 를 collection 내에 존재하는 객체의 런타임 자료형으로 형변환할수 있는지 테스트하지 않는다. 단지 System.Object를 foreach 문 내에서 선언된 자료형으로 변환 할수 있는지만 테스트하게 된다.
출처 : Effective C#
as , is 와 cast 에 차이점.
1. as 와 is 연산자는 사용자가 정의한 형변환 연산자의 존재를 고려하지 않기 때문에 런타임의 수행성능 효율도 좋다. as 와 is 연산자는 런타임에 정확한 타입의 변환이 가능할 때에만 형변환을 수행한다. 또한 형변환을 수행하기 위해서 새로운 객체를 만들거나 하지 않는다.
2. 사용자가 정의한 형변환 연산자를 어떻게 다루는지.
as 나 is 연산자는 런타임에 객체의 형변환이 가능한지를 확인하기 위해서 사용자가 정의한 형변환 연산자를 전혀 고려하지 않는다. as 나 is를 이용하여 형변환을 시도하면 객체가 변환 요청된 타입이거나 변환 요청된 타입으로부터 상속된 타입이 아닌 경우 실패하게 된다.
cast 연산을 수행하는 코드를 사용하게 되면 컴파일러는 객체를 변환 요청된 타입으로 변경할 수 있는 다양한 형변환 연산자를 고려하여 형변환을 수행하는 코드를 만들어낸다.
출처 : Effective C#
태그 : c샵, EffectiveC샵




덧글