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.
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#.
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
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
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