저는 VB.NET에 들어간 경험이 많은 C / C ++ / C # 프로그래머입니다. 나는 일반적으로 CType (및 CInt, CBool, CStr)을 캐스트에 사용합니다. 문자 수가 적고 노출 된 첫 번째 캐스팅 방법이기 때문에 DirectCast와 TryCast도 알고 있습니다.
간단히 말해, DirectCast와 CType간에 차이점 (캐스트 효과, 성능 등)이 있습니까? TryCast의 아이디어를 이해합니다.
저는 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)
IEnumerable
IEnumerable
Array
Object
개체 인스턴스의 유형이 실제로 상속 트리의 캐스트 유형 아래 어딘가에 있다고 가정하면에서 무엇이든 .
이것은 훨씬 더 빠르기 때문에 바람직합니다 . 수행해야하는 변환 및 유형 검사가 적습니다.
CType()
C # 캐스팅 연산자보다 덜 엄격합니다. (int)
문자열을 정수로 변환하는 것과 같이 단순한 스타일 캐스트 로는 할 수없는 일을 수행 합니다. Convert.To___()
C #에서 호출하는 것만 큼 강력 합니다.___
캐스트의 대상 유형 인 합니다.
이것은 매우 강력하기 때문에 바람직합니다. 그러나이 힘은 성능을 희생합니다. DirectCast()
C #의 캐스트 연산자 만큼 빠르지는 않습니다 . 캐스트를 완료하려면 많은 작업을 수행해야 할 수 있기 때문입니다. 일반적으로 가능한 DirectCast()
경우 선호해야합니다 .
마지막으로 TryCast()
C # as
연산자 와 직접적으로 유사한 캐스팅 연산자 하나를 놓쳤습니다 .
DirectCast
이 또 다른 장점 이라고 말하고 싶습니다 . 실수를하면 컴파일러가 즉시 알려 주지만 CType
실수로 인해 런타임에 가끔 잘못된 동작이 발생할 수 있습니다. 지역 설정이 다른 일부 사용자 컴퓨터에서 발생할 수 있습니다.
DirectCast
, TryCast
, CType
/ Convert.ToXYZ()
, C<xyz>()
올바른 것입니까?
DirectCast
인터페이스가 아닌 클래스에 대해서만 엄격합니다. .NET 유형 .GetInterfaces
목록에 정의되지 않은 인터페이스를 실제로 구현하는 COM 유형 및 다른 유형을 가질 수 있기 때문 입니다.
TryCast()
와 as
정확하게 동일하지 않습니다. TryCast()
참조 유형에서만 작동하고 as
null이 될 수있는 모든 항목에서 작동합니다. 따라서 int? icast = myNum as int?;
잘 작동하지만 Dim icast as Integer? = TryCast(myNum, Integer?)
컴파일러 오류가 발생합니다. 두 언어의 특이한 차이점이 하나 더 있습니다. lol
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