본문 바로가기

Language/C#

is, as Keyworkd

is


형변환이 가능한지(서로의 타입이 호환 가능한지)를 확인해준다.



as


Reference type 형변환을 할때 사용한다.




Cast보다 is, as 형변환을 사용하자


형변환을 할때마다 as연산자를 사용하는것이 좋은 선택이다. as연산자가 cast연산자를 사용하는 것 보다 더 안정적이고 런타임에 더 효율적이다.

as연산자를 사용하면 try/catch구문이 필요가 없으므로 코드가 간결하고 부하가 줄어든다.

as연산자는 valu type의 변환은 불가능하다. 변환에 실패하면 null값을 반환하는데 value type에는 null값을 넣을 수 없기 떄문이다.



is / as 장점


as와 cast의 가장 큰 차이점은  사용자 정의 변환의 처리이다.


as는 사용자가 정의한 연산을 허용하지 않는다.


as나 is는 변환시에 요청 타입이 아니거나 파생된 타입이면 변환에 실패한다.

하지만 cast는 요청타입으로 변환한다.

(long에서  short으로 변환이 가능하며 정보 손실이 발생한다.)


is는 as를 사용할 수 없을때에만 사용하는것이 좋다.



cast연산자가 필요한 경우


value type의 변환이 필요하다면 Cast 연산자가 필요하다.

(as연산자는 value type의 변환은 불가능하다.)


사용자 정의 변환(user define operator)는 cast만 가능하다

cast 연산자는 컴파일 타임에 코드를 생성하기 떄문에, 변환 시도시에 코드상에 있는 형태로부터 변환하려는 타입으로 변환을

시도한다. 런타임의 타입은 모른다. 따라서 컴파일 타임에 object에서 원하는 type으로 변환을 실패하면 compiler는 runtime에 object type이

변환하려는 type인지만 확인하는 code를 생성한다.


foreach 구문에서 type변환은 cast로 된다. (array에서 임시값의 타입으로 변경시에)

foreach에서 value type과 참조타입이 모두 올 수 있기때문이다. 

따라서 InvalidCastException이 발생할 수 있다.



    
MyClass myClassByCast = (MyClass)obj;
MyClass myClassByCast = obj as MyClass;

object obj = MyClass.GetValue();
int i = (int)obj; //가능
int j = obj as int; //불가능(int는 null값이 불가능하기 떄문에)

//위의코드를 아래코드로 변환한다

object obj = MyClass.GetValue();
int i;
if(obj is int)
    i = (int)obj;




참조

https://hongjinhyeon.tistory.com/55




'Language > C#' 카테고리의 다른 글

Dictionary  (0) 2019.02.27
ref, out, Tryparse Keyword  (0) 2019.02.26
C#에서의 Get / Set  (0) 2019.02.25
GC / SGen  (0) 2019.02.25
CLR / CLI / JIT / AOT  (0) 2019.02.25