VB.NET에서 DirectCast ()와 CType ()의 차이점


99

저는 VB.NET에 들어간 경험이 많은 C / C ++ / C # 프로그래머입니다. 나는 일반적으로 CType (및 CInt, CBool, CStr)을 캐스트에 사용합니다. 문자 수가 적고 노출 된 첫 번째 캐스팅 방법이기 때문에 DirectCast와 TryCast도 알고 있습니다.

간단히 말해, DirectCast와 CType간에 차이점 (캐스트 효과, 성능 등)이 있습니까? TryCast의 아이디어를 이해합니다.


6
DirectCast, CType, TryCast를 사용 하는이 Casting DataTypes 의 정확한 복제 stackoverflow.com/questions/2703585/…
MarkJ

답변:


182

가장 먼저 주목해야 할 것은 VB.NET은 C #의 (type)instance캐스팅 메커니즘과 직접적으로 유사하지 않다는 것 입니다. 두 VB.NET 연산자를 비교하는 시작점으로 유용하기 때문에이 문제를 제기합니다 (함수 의미가 있더라도 함수가 아니라 연산자입니다).

DirectCast()C # 캐스팅 연산자보다 더 엄격합니다. 이미 캐스팅 중인 아이템이 캐스팅 대상 유형일 때만 캐스팅 할 수 있습니다 . 나는 그것이 여전히 가치 유형을 풀 것이라고 믿지만 그렇지 않으면 어떤 변환도하지 않을 것이다. 따라서 예를 들어 C # 캐스트 와 마찬가지로 에서 short로 캐스트 할 수 없습니다 . 그러나 기본 개체 변수가 실제로 . 물론 캐스트 할 수 있습니다.int(int)IEnumerableIEnumerableArrayObject 개체 인스턴스의 유형이 실제로 상속 트리의 캐스트 유형 아래 어딘가에 있다고 가정하면에서 무엇이든 .

이것은 훨씬 더 빠르기 때문에 바람직합니다 . 수행해야하는 변환 및 유형 검사가 적습니다.

CType()C # 캐스팅 연산자보다 덜 엄격합니다. (int)문자열을 정수로 변환하는 것과 같이 단순한 스타일 캐스트 로는 할 수없는 일을 수행 합니다. Convert.To___()C #에서 호출하는 것만 큼 강력 합니다.___캐스트의 대상 유형 인 합니다.

이것은 매우 강력하기 때문에 바람직합니다. 그러나이 힘은 성능을 희생합니다. DirectCast()C #의 캐스트 연산자 만큼 빠르지는 않습니다 . 캐스트를 완료하려면 많은 작업을 수행해야 할 수 있기 때문입니다. 일반적으로 가능한 DirectCast()경우 선호해야합니다 .

마지막으로 TryCast()C # as연산자 와 직접적으로 유사한 캐스팅 연산자 하나를 놓쳤습니다 .


23
+1 엄격함 DirectCast이 또 다른 장점 이라고 말하고 싶습니다 . 실수를하면 컴파일러가 즉시 알려 주지만 CType실수로 인해 런타임에 가끔 잘못된 동작이 발생할 수 있습니다. 지역 설정이 다른 일부 사용자 컴퓨터에서 발생할 수 있습니다.
MarkJ

1
좋은 대답입니다. 그래서 복잡한 순서 (크고 작은) : DirectCast, TryCast, CType/ Convert.ToXYZ(), C<xyz>()올바른 것입니까?
좌우명

3
@motto-닫습니다. C <xyz> () "함수"는 함수 의미론이 있더라도 실제로는 함수가 아닌 연산자이므로 목록에서 더 높은 위치로 이동해야합니다. 이러한 유형의 경우 C #의 (유형) 캐스팅에 매우 가깝지만 약간 더 많은 작업을 수행합니다.
Joel Coehoorn

3
주석은 @MarkJ +1이지만 DirectCast인터페이스가 아닌 클래스에 대해서만 엄격합니다. .NET 유형 .GetInterfaces목록에 정의되지 않은 인터페이스를 실제로 구현하는 COM 유형 및 다른 유형을 가질 수 있기 때문 입니다.
Mark Hurd 2013

2
1 @JoelCoehoorn, 그러나 실제로 TryCast()as정확하게 동일하지 않습니다. TryCast()참조 유형에서만 작동하고 asnull이 될 수있는 모든 항목에서 작동합니다. 따라서 int? icast = myNum as int?;잘 작동하지만 Dim icast as Integer? = TryCast(myNum, Integer?)컴파일러 오류가 발생합니다. 두 언어의 특이한 차이점이 하나 더 있습니다. lol
CptRobby

12

으로 CType당신과 같은 몇 가지 일을 쓸 수 있습니다 Ctype("string",Integer). 그러나 DirectCast위의 문을 사용하면 컴파일 시간 오류가 발생합니다.

 Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile

0

DirectCast보다 제한적 CType입니다.

예를 들어 다음과 같은 오류가 발생합니다.

Sub Main()
    Dim newint As Integer = DirectCast(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub

Visual Studio IDE에도 표시됩니다.

그러나 이것은 오류를 발생시키지 않습니다.

Sub Main()
    Dim newint As Integer = CType(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.