[vb.net] VB.NET에서 DirectCast ()와 CType ()의 차이점

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

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



답변

가장 먼저 주목해야 할 것은 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연산자 와 직접적으로 유사한 캐스팅 연산자 하나를 놓쳤습니다 .


답변

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

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


답변

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


답변