2010-04-24 13 views
39

Odkąd przeniosłem się z VB6 do VB.NET gdzieś w 2005 roku, używam CType do odlewania z jednego typu danych do drugiego. Robię to, ponieważ jest to po prostu szybsze w pisaniu, używane w VB6 i nie wiem, dlaczego muszę używać DirectCast, jeśli nie ma między nimi żadnej różnicy.Casting DataTypes z DirectCast, CType, TryCast

Używam programu TryCast raz na jakiś czas, ponieważ rozumiem, że czasami rzucanie może się nie udać. Nie mogę jednak odróżnić CType od DirectCast.

Czy ktoś może mi powiedzieć różnicę w prostym języku angielskim, jaka jest różnica między tymi dwoma (CType i DirectCast)? Pomocne byłoby również dodanie przykładów miejsc, w których można użyć.

Dzięki.

+0

możliwe duplikat [Różnica pomiędzy DirectCast() i CType() w VB.NET] (http://stackoverflow.com/questions/3056514/difference-between-directcast-and-ctype-in -vb-net) – RMalke

+4

@RMalke: Moje pytanie zadano przed połączonym pytaniem ["duplikat"] (http://stackoverflow.com/q/3056514). Potwierdza to [komentarz MarkJ] (http://stackoverflow.com/posts/comments/3138442). Dodatkowo, przyjęta tutaj odpowiedź wyjaśnia szczegółowo rzucanie "CType", czego tak naprawdę nie akceptuje zaakceptowana odpowiedź w drugim pytaniu. Jeśli już, to uważam, że to druga, która musi zostać zamknięta lub w inny sposób z tym powiązana. –

Odpowiedz

51

TryCast i DirectCast są operatorami odlewania, które są bezpośrednio odwzorowane na obsługę rzutowania przez CLR. Mogą szybko rzutować obiekt typu bazowego na typ wyprowadzony lub rozpakować wartość typu wartości. DirectCast zgłasza wyjątek, gdy rzutowanie nie jest możliwe, program TryCast zwraca Nic, jeśli się nie udało. Zazwyczaj chcesz faworyzować DirectCast, aby złapać błędy w programowaniu.

CType pozwala na nadzbiór nad konwersjami, takie, na które CLR patrzy. Najlepszym przykładem, jaki mogę wymyślić jest zamiana ciągu na liczbę lub datę. Na przykład:

Dim obj As Object 
obj = "4/1/2010" 
Dim dt As DateTime = CType(obj, DateTime) 

Które musisz użyć, jeśli opcja Strict On jest włączona. Jeśli jest wyłączony następnie można to zrobić bezpośrednio:

Option Strict Off 
... 
    Dim dt As DateTime = obj 

Bardzo wygodny i oczywiście część spuścizny VB.NET jako dynamicznie wpisywanych języka. Ale nie bez problemów, ta data to dzień Unicorn na stackoverflow.com, ale będzie to dzień w styczniu, kiedy Brytyjczyk wejdzie do łańcucha. Nieoczekiwane konwersje powodują, że CLR nie zezwala na nie bezpośrednio. Wyraźna, nigdy konwersja niespodzianką wygląda następująco:

Dim dt As DateTime = DateTime.Parse(obj.ToString(), _ 
    System.Globalization.CultureInfo.GetCultureInfo("en-US").DateTimeFormat) 

czy należy kupić w try/DirectCast vs CType vs jawnych konwersji jest raczej osobistym wyborem. Jeśli teraz programujesz z Option Strict On, zdecydowanie powinieneś zacząć używać metody Try/DirectCast. Jeśli preferujesz język VB.NET, ponieważ lubisz wygodę pisania dynamicznego, nie wahaj się pozostać przy CType.

15

DirectCast jest dwa razy szybszy dla typów wartości (liczb całkowitych ... itd.), Ale identyczny dla typów odniesienia. Aby uzyskać więcej informacji, zobacz sekcję "Funkcje konwersji, CType, DirectCast i System.Convert" na stronie MSDN this.

+0

Podany link zawiera bardzo dobrą dokumentację. Wielkie dzięki. –

1

Ten page wyjaśnia to dobrze.

Czytanie tego, myślę, że kiedy używasz DirectCast, jesteś pewien, że konwersja zadziała bez zwężenia lub rozszerzenia (w tym przypadku danych liczbowych). Podczas gdy CType spróbuje się do tego przekonwertować, przy czym deweloper będzie wiedział o zawężaniu/rozszerzaniu.

+3

Jest to typ środowiska wykonawczego i określony typ, którego nie rozumiem. Jeśli zadeklaruję Double, oczekuję, że jawnie rzutowanie go na liczbę całkowitą powinno zadziałać. Jak to jest, że CType jest w stanie zrobić to doskonale, a DirectCast nie może tego zrobić. Czy tu czegoś brakuje? Zwykły angielski, proszę ... –

0

Przez "konwersja" rozumie się przekształcanie jednego typu danych na inny (np. Ciąg na całkowitą, dziesiętną na całkowitą, obiekt na ciąg itp.).

Przez "rzutowanie" rozumie się zmianę jednego typu obiektu na inny typ, który jest powiązany z nim przez jedną z następujących reguł.

http://www.thedevheaven.com/2012/09/directcast-vs-ctype.html