Jak przesyłać w VB.NET?

151

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)
Zack Peterson
źródło

Odpowiedzi:

156

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 varnie 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)varw C #.
  • TryCast(jak wspomniano w @ NotMyself ) jest podobne DirectCast, ale zwróci, Nothingjeśli zmienna nie może zostać przekonwertowana na ciąg, zamiast rzucać wyjątek. To jest to samo, co var as stringw C #. TryCastStrona na MSDN ma dobre porównanie, też.
bdukes
źródło
15
Nigdy nie ma powodu, aby używać CType (var, String) zamiast CStr (var), robią dokładnie to samo.
Jonathan Allen
2
@Maslow TryCastdziała tylko dla typów wartości, ponieważ musi to być typ, który może mieć Nothingjako wartość
bdukes
1
@Martinho ma rację. To powinno powiedzieć „działa tylko dla typu referencyjnego
bdukes
3
CStr(var)dusi i zgłosi wyjątek, jeśli zmienna ma wartość DBNull.Value, ale alternatywa Convert.ToString(var)zwróci pusty ciąg.
MCattle
Dim myList AS ArrayList=new ArrayListKiedy 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.
Bellash
13

Cstr() jest kompilowany w tekście dla lepszej wydajności.

CType umożliwia rzutowanie między typami, jeśli zdefiniowano operator konwersji

ToString() Między typem bazowym a ciągiem znaków zgłasza wyjątek, jeśli konwersja nie jest możliwa.

TryParse()From String to base typeifpossible, w przeciwnym razie zwraca false

DirectCastuż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, trycastnie zwróci nic w tym przypadku

Siddharth Rout
źródło
8

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.

OwenP
źródło
8

Wolę następującą składnię:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

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.

NotMyself
źródło
2
Myślę, że jesteś w błędzie. W ogóle nie jest dobrym pomysłem używanie TryCast. w przypadku takim jak twój należy użyć number.ToString () lub CStr (number).
Shimmy Weitzhandler
4
@Shimmy: Jaki jest powód, dla którego w ogóle nie używasz TryCast? Czy nie jest lepiej niż DirectCast, aby uniknąć wyjątku w niektórych scenariuszach?
Dienekes
3
@Dienekes and NotMyself. TryCast jest tylko dla typów REFERENCYJNYCH. Tutaj mamy liczbę całkowitą, która jest typem WARTOŚCI. Kompilator odrzuci TryCast. Celem jest również String. Dowolna jednostka .Net poza Nothing obsługuje .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.
ToolmakerSteve
4

Użytkownik Konrad Rudolph opowiada się za DirectCast () w pytaniu o przepełnienie stosu „Ukryte funkcje VB.NET” .

Zack Peterson
źródło
-1, ponieważ DirectCast jest tutaj rażąco NIE odpowiedni, z wyjątkiem bardzo ograniczonej sytuacji, o której nie zawracałeś sobie głowy wspomnieniem. DirectCast jest dobry, gdy wiesz, że masz dwa POWIĄZANE RODZAJE ODNIESIEŃ i chcesz wydajnego przesyłania między nimi. Ponieważ pytanie dotyczy uzyskania String, jest mało prawdopodobne, aby OP omawiał sytuację, w której DirectCast jest odpowiedni.
ToolmakerSteve
... Gdyby w pytaniu nie było Stringi ToString, moja skarga nie miałaby zastosowania. Nie powinieneś opowiadać się za DirectCast, dopóki nie zawęzisz tematu z ogólnej KONWERSJI.
ToolmakerSteve
1

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.

SickPuP
źródło
1
Do Twojej wiadomości, według Paula Vicka z firmy Microsoft, operatorzy Cxxx byli szybsi niż funkcje Convert.Toxxx, przynajmniej w 2004 roku, ponieważ Cxxx kompiluje się bezpośrednio do IL, zamiast wywoływać funkcję. Chociaż jego uzasadnienie wydaje się wątpliwe, biorąc pod uwagę możliwość optymalizacji JIT wywołań funkcji na zewnątrz. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve
0

Pamiętam, że kiedyś widziałem stan biblioteki MSDN do używania CStr (), ponieważ była szybsza. Nie wiem jednak, czy to prawda.

joek1975
źródło
2
DirectCast jest szybszy niż CStr, ale można go używać tylko podczas rzutowania obiektu ciągu na zmienną ciągu. Nie powiedzie się, jeśli spróbujesz przekształcić dowolny inny obiekt w łańcuch.
Jonathan Allen