Różnica między DirectCast () i CType () w VB.NET

Jestem doświadczonym programistą C/C++ / C#, który dopiero co dostał się do VB.NET. generalnie używam CType (i CInt, CBool, CStr) do odlewów, ponieważ jest mniej znaków i był pierwszym sposobem odlewania, na który byłem narażony, ale jestem świadomy DirectCast i TryCast, jak również.

Po prostu, czy są jakieś różnice (efekt obsady, wydajność, itp.) między DirectCast i CType? Rozumiem ideę TryCast.

Author: Peter Mortensen, 2010-06-16

3 answers

Pierwszą rzeczą, którą należy zauważyć, jest to, że VB.NET nie ma bezpośredniego analogia do mechanizmu odlewania C#'S (type)instance. Wspominam o tym, ponieważ warto wykorzystać to jako punkt wyjścia do porównania tych dwóch VB.NET operatory (i są operatorami, a nie funkcjami, mimo że mają semantykę funkcji).

DirectCast() jest bardziej rygorystyczny niż operator C#. Pozwala ci to rzucać tylko wtedy, gdy przedmiot rzucany jest już typem, na który rzucasz. Nie nawróci się. Więc, na przykład, nie można cast od short do int, jak można z C# (int) cast. Ale możesz przerzucić z liczby do tablicy, jeśli twoja zmienna obiektowa IEnumerable naprawdę jest Array. I oczywiście możesz rzucać z obiektu do czegokolwiek, zakładając, że typ twojej instancji obiektu naprawdę znajduje się gdzieś poniżej Twojego typu rzucania w drzewie dziedziczenia.

Jest to pożądane, ponieważ to sprawia, że szybciej . Jest trochę mniej konwersji i sprawdzania typu, które muszą miejsce.

CType() jest mniej rygorystyczny niż operator C#. Spowoduje to takie rzeczy, jak konwersja ciągu znaków na liczbę całkowitą, której nie można po prostu zrobić za pomocą prostego odlewu (int). Ma tyle samo mocy, co wywołanie Convert.To___() W C#, gdzie _ _ _ jest typem docelowym Twojej obsady. Jest to pożądane, ponieważ jest bardzo potężny, ale ta moc jest kosztem wydajności - nie jest tak szybki jak DirectCast() lub C#'s cast operator, ponieważ może być sporo pracy do zrobienia, aby zakończyć Obsada

Generalnie powinieneś preferować DirectCast() Kiedy możesz.

W końcu przegapiłeś jeden operator castingu: TryCast(), który jest bezpośrednim analogiem do operatora as C#.

 159
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 05:23:32

Z CType możesz napisać coś takiego Ctype("string",Integer). Ale z DirectCast powyższa instrukcja dałaby błąd czasu kompilacji.

 Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile
 10
Author: Abhay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 01:27:38

DirectCast jest bardziej restrykcyjna niż CType.

Na przykład spowoduje to błąd:

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

Zostanie również pokazany w Visual Studio IDE.

To jednak nie rzuca błędu:

Sub Main()
    Dim newint As Integer = CType(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub
 0
Author: Hemantha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 08:17:10