VB.NET에서 어떻게 캐스팅해야합니까?


151

이 모든 것이 동일합니까? 어떤 상황에서 서로를 선택해야합니까?

  • var.ToString ()

  • CStr (var)

  • C 타입 (var, String)

  • DirectCast (var, String)


편집 : NotMyself의 제안 ...

  • TryCast (var, String)

답변:


156

그것들은 모두 약간 다르며 일반적으로 사용이 허용됩니다.

  • var.ToString()어떤 유형인지에 관계없이 객체의 문자열 표현을 제공합니다. var문자열이 아닌 경우 이것을 사용하십시오 .
  • CStr(var)VB 문자열 캐스트 연산자입니다. 나는 VB 사람이 아니므로 피하는 것이 좋지만 실제로 아무것도 아프지 않을 것입니다. 나는 그것이 기본적으로와 같다고 생각합니다 CType.
  • CType(var, String) 제공된 변환 연산자를 사용하여 지정된 유형을 문자열로 변환합니다.
  • DirectCast(var, String)객체를 문자열로 업 캐스트하는 데 사용됩니다. 객체 변수가 실제로 문자열이라는 것을 알고 있다면 이것을 사용하십시오. 이것은 (string)varC #에서 와 동일 합니다.
  • TryCast(@ NotMyself 에서 언급했듯이 )는 같지만 변수를 예외로 처리하지 않고 문자열로 변환 할 수없는 경우 DirectCast반환 Nothing합니다. 이것은 var as stringC #에서 와 동일 합니다. TryCastMSDN 의 페이지도 잘 비교됩니다.

15
CStr (var) 대신 CType (var, String)을 사용해야 할 이유는 없으며 정확히 같은 일을합니다.
Jonathan Allen

2
@Maslow TryCast만이 가질 수있는 형태가 될 필요가 있기 때문에, 값 유형 작동 Nothing값으로
bdukes

1
@Martinho 아주 그렇습니다. 즉 "에만 작동 말을해야 참조 타입"
bdukes

3
CStr(var)var가 DBNull.Value 인 경우 질식하고 예외가 발생하지만 대체 Convert.ToString(var)는 빈 문자열을 반환합니다.
MCattle

Dim myList AS ArrayList=new ArrayList당신이 쓸 때 (From e In myList select CType(e.Name,String)).ToArray()작동하지 않습니다. 나는 글을 쓰기 위해 왔고 ... select CType(e.Name.ToString,String)).ToArray()나는 미소를 되찾았다.
Bellash

13

Cstr() 더 나은 성능을 위해 인라인으로 컴파일됩니다.

CType 변환 연산자가 정의 된 경우 유형 간 캐스트 가능

ToString() 변환 할 수없는 경우 기본 유형과 문자열 사이에서 예외가 발생합니다.

TryParse()String에서 base까지 typeif가능하면 false를 반환합니다.

DirectCast유형이 상속을 통해 관련되거나 공통 인터페이스를 공유하는 경우 사용되며 캐스트가 불가능하면 예외가 발생 trycast하고이 인스턴스에서 아무것도 반환하지 않습니다


8

MSDN 은 특정 유형에 대한 Cxxx 캐스트가 인라인 코드로 변환되기 때문에 VB .NET에서 성능을 향상시킬 수 있음을 나타냅니다. 어떤 이유로 든 특정 유형의 CType과 달리 DirectCast 를 제안 합니다 (문서에는 상속 관계가있을 때의 내용이 나와 있습니다. VB 런타임.)

VB .NET 코드를 작성할 때 내가 사용하는 작업은 수행중인 작업에 따라 다릅니다. 프로토 타입 코드라면 버릴 것입니다. 나는 입력하는 모든 것을 사용합니다. 내가 진지한 코드라면 Cxxx 캐스트를 사용하려고합니다. 존재하지 않는 경우 상속 관계가 있다고 합리적으로 믿는 경우 DirectCast를 사용합니다. 캐스트가 성공 해야하는지 잘 모르는 상황 (예 : 사용자 입력-> 정수) 인 경우 TryCast를 사용하여 사용자에게 예외를 던지는 것보다 친절한 작업을 수행합니다.

내가 흔들 수없는 한 가지는 CStr 대신 ToString을 사용하는 경향이 있지만 Cstr이 더 빠르다는 것입니다.


8

다음 구문을 선호합니다.

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

Hah는 일반적으로 C #으로 코드를 작성한다고 말할 수 있습니다. 8)

내가 TryCast를 선호하는 이유는 예외 캐스팅의 오버 헤드를 망칠 필요가 없기 때문입니다. 캐스트가 성공하거나 변수가 null로 초기화되고 그에 따라 처리됩니다.


2
당신이 틀렸다고 생각합니다. TryCast를 전혀 사용하지 않는 것이 좋습니다. 귀하와 같은 경우에는 number.ToString () 또는 CStr (number)을 사용해야합니다.
Shimmy Weitzhandler,

4
@ Shimmy : TryCast를 전혀 사용하지 않는 이유는 무엇입니까? DirectCast가 특정 시나리오에서 예외를 피하는 것이 더 좋지 않습니까?
Dienekes

3
@Dienekes와 NotMyself. TryCast는 REFERENCE 유형에만 해당됩니다. 여기에는 정수 유형 인 VALUE 유형이 있습니다. 컴파일러는 TryCast를 거부합니다. 또한 목표는 문자열입니다. 아무것도 지원하지 않는 모든 .Net 엔터티 .ToString(). Integer와 같은 값 유형은 Nothing 일 수 없습니다. 따라서이 경우 CStr (number) 또는 number.ToString ()이 안전합니다. 일반적인 경우 (값 유형이 아닌) CStr (무엇이든)은 Nothing을 처리 할 수 ​​있으므로 안전합니다. 결과는 String 변수에서 Nothing이됩니다. TryCast는 여기가 아니라 매우 유용합니다.
ToolmakerSteve

4

-1 언급 할 필요가없는 매우 제한된 상황을 제외하고는 DirectCast가 여기에별로 적합하지 않기 때문에 -1입니다. DirectCast는 두 개의 관련 참조 유형이 있고 이들 사이에 효율적인 캐스팅을 원할 때 유용합니다. 의문은에 관한 String것이기 때문에 OP가 DirectCast가 적절한 상황에 대해 논의하고 있지는 않습니다.
ToolmakerSteve

... 질문에 언급되지 않은 경우 StringToString내 불만 사항이 적용되지 않습니다. 일반 CONVERSION에서 주제를 좁힐 때까지 DirectCast를 옹호해서는 안됩니다.
ToolmakerSteve

1

인증 시험에 따르면 CXXX 변환보다 성능이 더 우수하므로 간단한 변환에 가능할 때마다 Convert.ToXXX ()를 사용해야합니다.


1
참고로 Microsoft의 Paul Vick에 따르면 Cxxx 연산자는 함수를 호출하지 않고 IL로 직접 컴파일하기 때문에 2004 년에 Convert.Toxxx 함수보다 빠릅니다. 그의 이론적 근거는 모호한 것처럼 보이지만 함수 호출을 JIT 최적화 할 수있는 능력이 주어졌다. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve

0

한 번에, MSDN 라이브러리 상태가 더 빠르기 때문에 CStr ()을 사용하는 것을 보았습니다. 그래도 이것이 사실인지 모르겠습니다.


2
DirectCast는 CStr보다 빠르지 만 문자열 객체를 문자열 변수로 캐스팅 할 때만 사용할 수 있습니다. 다른 객체를 문자열로 변환하려고하면 실패합니다.
Jonathan Allen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.