Czy wszystkie są równe? W jakich okolicznościach powinienem wybrać jednego spośród pozostałych?
var.ToString ()
CStr (var)
CType (zmienna, ciąg)
DirectCast (var, String)
EDYCJA: sugestia od NotMyself …
- TryCast (var, String)
Wszystkie są nieco inne i ogólnie mają akceptowalne zastosowanie.
var.
ToString
()
da ci ciąg znaków reprezentujący obiekt, niezależnie od jego typu. Użyj tego, jeśli var
nie jest już ciągiem.CStr
(var)
jest operatorem rzutowania napisów VB. Nie jestem facetem od VB, więc sugerowałbym unikanie tego, ale tak naprawdę nic to nie zaszkodzi. Myślę, że to w zasadzie to samo co CType
.CType
(var, String)
skonwertuje podany typ na łańcuch, używając dowolnych dostarczonych operatorów konwersji.DirectCast
(var, String)
służy do przesyłania obiektu w górę do łańcucha. Jeśli wiesz, że zmienna obiektowa jest w rzeczywistości łańcuchem, użyj tego. To jest to samo, co (string)var
w C #.TryCast
(jak wspomniano w @ NotMyself ) jest podobne DirectCast
, ale zwróci, Nothing
jeśli zmienna nie może zostać przekonwertowana na ciąg, zamiast rzucać wyjątek. To jest to samo, co var as string
w C #. TryCast
Strona na MSDN ma dobre porównanie, też.
TryCast
działa tylko dla typów wartości, ponieważ musi to być typ, który może miećNothing
jako wartośćCStr(var)
dusi i zgłosi wyjątek, jeśli zmienna ma wartość DBNull.Value, ale alternatywaConvert.ToString(var)
zwróci pusty ciąg.Dim myList AS ArrayList=new ArrayList
Kiedy piszesz,(From e In myList select CType(e.Name,String)).ToArray()
to nie działa. Przyszedłem pisać... select CType(e.Name.ToString,String)).ToArray()
i odzyskałem uśmiech.Cstr()
jest kompilowany w tekście dla lepszej wydajności.CType
umożliwia rzutowanie między typami, jeśli zdefiniowano operator konwersjiToString()
Między typem bazowym a ciągiem znaków zgłasza wyjątek, jeśli konwersja nie jest możliwa.TryParse()
From String to basetypeif
possible, w przeciwnym razie zwraca falseDirectCast
używane, jeśli typy są powiązane przez dziedziczenie lub mają wspólny interfejs, zgłosi wyjątek, jeśli rzutowanie nie jest możliwe,trycast
nie zwróci nic w tym przypadkuźródło
Wydaje się, że MSDN wskazuje, że rzutowania Cxxx dla określonych typów mogą poprawić wydajność w VB .NET, ponieważ są konwertowane na kod wbudowany. Z jakiegoś powodu sugeruje również DirectCast w przeciwieństwie do CType w niektórych przypadkach (dokumentacja stwierdza, że jest to relacja dziedziczenia; uważam, że oznacza to, że poprawność rzutowania jest sprawdzana w czasie kompilacji i można zastosować optymalizacje, podczas gdy CType zawsze używa Środowisko wykonawcze VB).
Kiedy piszę kod VB .NET, to, czego używam, zależy od tego, co robię. Jeśli jest to kod prototypowy, który mam zamiar wyrzucić, używam wszystkiego, co napiszę. Jeśli chodzi o kod, o którym mówię poważnie, próbuję użyć rzutowania Cxxx. Jeśli takiego nie ma, używam DirectCast, jeśli mam uzasadnione przekonanie, że istnieje związek dziedziczenia. Jeśli jest to sytuacja, w której nie mam pojęcia, czy rzutowanie powinno się powieść (na przykład dane wejściowe użytkownika -> liczby całkowite), używam TryCast, aby zrobić coś bardziej przyjaznego niż rzucanie wyjątku do użytkownika.
Jedną rzeczą, której nie mogę się pozbyć, jest to, że używam ToString zamiast CStr, ale podobno Cstr jest szybszy.
źródło
Wolę następującą składnię:
Hah, możesz powiedzieć, że zazwyczaj piszę kod w C #. 8)
Powodem, dla którego wolę TryCast, jest to, że nie musisz martwić się narzutem związanym z rzutowaniem wyjątków. Twoje rzutowanie powiedzie się lub zmienna jest inicjalizowana na wartość null i odpowiednio sobie z tym radzisz.
źródło
.ToString()
. Typ wartości, taki jak Integer, nie może być Nothing. Więc w tym przypadku CStr (number) lub number.ToString () jest bezpieczne. W ogólnym przypadku (nie tylko typów wartości) CStr (cokolwiek) jest bezpieczny, ponieważ może obsłużyć Nothing - wynikiem będzie Nothing w zmiennej String. TryCast jest bardzo przydatny - tylko nie tutaj.Użytkownik Konrad Rudolph opowiada się za DirectCast () w pytaniu o przepełnienie stosu „Ukryte funkcje VB.NET” .
źródło
String
, jest mało prawdopodobne, aby OP omawiał sytuację, w której DirectCast jest odpowiedni.String
iToString
, moja skarga nie miałaby zastosowania. Nie powinieneś opowiadać się za DirectCast, dopóki nie zawęzisz tematu z ogólnej KONWERSJI.Zgodnie z egzaminem certyfikacyjnym powinieneś używać Convert.ToXXX () zawsze, gdy to możliwe, do prostych konwersji, ponieważ optymalizuje to wydajność lepiej niż konwersje CXXX.
źródło
Pamiętam, że kiedyś widziałem stan biblioteki MSDN do używania CStr (), ponieważ była szybsza. Nie wiem jednak, czy to prawda.
źródło