2010-02-25 2 views
4

나는 형식 캐스팅 방법의 차이점을 얻으려고합니다.유형 변환의 다른 방법. 차이점은 무엇입니까

예 :

방법 1

public byte fun() 
{ 
    object value=1; 
    return (byte)value; // this gives me error 
} 

방법 2

public byte fun() 
{ 
    object value=1; 
    return byte.Parse(value.ToString()); // this runs 
} 

방법 3

public byte fun() 
{ 
    object value=1; 
    return Convert.ToByte(value); // this runs 
} 

간의 차이가 무엇 세 명 모두. 내부적으로 어떻게 작업하고 있는지. 값 유형 및 참조 유형은 무엇입니까? 내가이 줄 어떤 데이터 유형을 쓸 때 어떤 기능은 REF 유형과 그 반대의 경우도 마찬가지

편집 2

에 값 유형을 변환 할 수있는 '1'이 기본 INT32, 바이트 또는 뭔가에 의해 처리됩니다.

오브젝트 값 = 1;

+0

덧붙여 bool byte.ryParse (string, out double value)입니다. – AxelEckenberger

+0

@Obalix : byte.TryPase (문자열, 바이트 값) –

답변

8

여기에 많은 질문이 있습니다.

단일 작업으로 언 저장소와 캐스트를 수행 할 수 없기 때문에 방법 1이 실패합니다. "값"을 박스형 정수로 설정합니다. 캐스트를 시도하면 정수를 언 박싱하고 단일 조작으로 바이트로 캐스트하려고 시도하는데 실패합니다. BTW이 수행 작업 :

return (byte)((int)value)); // Unbox, then cast, in two operations 

방법은 바이트로 변환 byte.Parse를 사용하여 다음, 문자열로 정수를 변환하고 있기 때문에이 작동합니다. 이것은 문자열로 /부터 이동하기 때문에 매우 비쌉니다.

메서드 3은 값의 개체가 IConvertible (int)임을 확인하고 적절한 변환 작업을 사용하여 바이트로 변환하기 때문에 작동합니다. 이 경우이 방법을 사용하면보다 효율적으로 접근 할 수 있습니다. "value"는 int를 저장하고 int는 IConvertible을 지원하기 때문에 Convert.ToByte는 기본적으로 null 체크를 한 다음 Convert.ToByte (int)를 호출합니다. 이것은 매우 빠릅니다 (경계 검사 및 직접 형변환).

Eric Lippert의 블로그 게시물 Representation and Identity을 읽는 것이 좋습니다. 자세히 캐스팅을 다루고 방법 1이 실패하는 이유를 설명합니다 ...

1
// This is a direct cast. It expects that the object 
// in question is already allocated as the data type 
// indicated in the cast 
(byte)value; 

// This is a direct code conversion. It takes the argument 
// and runs through code to create a new variable of the 
// type byte. You'll notice if you include this in different 
// code that value will still be an object but your new 
// data will be a byte type 
byte.Parse(value.ToString()); 

// This will convert any object similarly to the byte.Parse. 
// It is not as fast because it does not have a definitely 
// typed parameter (as parse has string). So it must go 
// through a couple of extra steps to guarantee the conversion 
// is smooth. 
Convert.ToByte(value); 

직접 전송이 항상 가장 빠릅니다. 형식이 이미 설정되고 할당되어 있다고 가정하므로 참조 형식을 메모리로 전환해야합니다. 변환 방법은 코드 변환이므로 약간의 시간이 필요합니다. 나는 벤치 마크를 모르지만 Parse는 특정 in과 특정 out (string-> byte)을 다루기 때문에 약간 빠릅니다. 변환은이 동일한 특이성이 없으므로 변환 방법 중 가장 느립니다.

방법 1

이 유형 캐스트입니다, 즉 값이 implcitly 또는 명시 적으로 바이트로 변환 될 수있는 형식이어야합니다 :

+0

그의 방법은 직접 형 변환이 아닙니다 ... 그것은 unbox + cast입니다. 실패합니다. –

+0

또한 int.ToByte (IConvertible.ToByte에서 직접)를 사용할 수 있으므로 Convert는 더 빠릅니다. –

+0

@ Reduce Copsey : 원래 바이트로 인스턴스화 된 경우 언 박싱됩니다. 그것은 아니 었습니다, 그것은 객체로서의 할당을 시작했습니다. "unboxed"되기 위해서는 먼저 바이트 단위로 박스 처리되어야합니다. 이 경우 직접 변환이므로 실패하는 것입니다. 참조 : http://msdn.microsoft.com/en-us/library/b95fkada(VS.80).aspx 및 http://msdn.microsoft.com/en-us/library/ms173105(VS.80). aspx –

0

그럼 여기에서 내 샷이다. 게다가, 값은 바이트의 범위를 벗어나지 않아야합니다.

컴파일러에서 어떤 유형의 객체를 전송해야하는지에 대한 정보가 없으므로 호출이 실패합니다. 따라서 암시 적 또는 명시 적 변환을 수행 할 수 없습니다.

int obj = 1; 
byte b = (byte) obj; 

또는

byte b = (byte) (int) obj; 

작품을하는. 두 번째 옵션은 Reed Copsey의 주석 및 게시물에 설명 된대로 명시 적 unboxing (따라서 필요한 정보 제공)을 사용합니다. Reed Copsey의 의견에 제공된 link은이를 자세히 설명합니다.

사용자 지정 개체 캐스트 사용의 경우 암시 적 및 명시 적 변환은 클래스에 정의 된 정적 메서드 인 연산자입니다. object에는 암시 적 또는 명시 적 작업이 없으므로 (이유는 link 참조), int에 대해서는 이러한 작업이 있습니다.

당신은 문자열의 값이 바이트의 경계 안에 숫자 여야하는 문자열을 구문 분석하는 여기에 2

방법. 여기에서는 TryParse을 사용하여 변환이 성공할지 여부를 확인할 수 있습니다.

방법 3

Convert 클래스의 형식 변환을 사용합니다. 대부분의 일반적인 유형을 지원하는 가장 유연한 방법입니다. 여기서 값은 numer로 변환 가능해야하며 값은 바이트 경계 내에 있어야합니다. Convert 클래스는 IConvertible을 사용하여 여러 유형간에 변환하므로 확장 할 수 있습니다.

+1

"방법 1"설명이 잘못되었습니다. unboxing -ie에 대한 특정 제한 사항입니다. 유형 T의 언 박싱은 T에 대해서만 직접 언 박싱 할 수 있습니다. 참조 : http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

+0

링크가 내 진술과 모순되는지 여부를 잘 모름 ...나는'int jjj = (int) (short) ooo;'가 당신이 염두에두고있는 진술이라고 생각한다. 내가 해석 할 때 그것은'short s = (short) ooo와 동일하다; int i = (int) short;'. 그리고이 행동은 내가 쓴 것과 일치 할 것입니다. – AxelEckenberger

+0

컴파일러는 "어떤 유형의 객체를 형 변환해야하는지에 대한 정보가 없으며, 언 박싱 할 때 유형이 다르며 한 번의 작업으로 unbox + cast 할 수 없습니다. –

관련 문제