2008-08-20 13 views
13

W .Net można odczytać wartość ciągu na inny typ danych przy użyciu albo <datatype>.parse lub Convert.To<DataType>.. Net Parse versus Convert

Nie jestem zaznajomiony z podstawami parse versus convert, więc zawsze jestem na stracie, gdy zapytam, który z nich jest lepszy/szybszy/bardziej odpowiedni.

A więc - która droga jest najlepsza w jakich okolicznościach?

Odpowiedz

15

W Convert.ToXXX() metody są dla obiektów, które mogą być z prawidłowym lub podobnego typu, a .Parse() i .TryParse() są specjalnie dla strun:

//o is actually a boxed int 
object o = 12345; 

//unboxes it 
int castVal = (int) 12345; 

//o is a boxed enum 
object o = MyEnum.ValueA; 

//this will get the underlying int of ValueA 
int convVal = Convert.ToInt32(o); 

//now we have a string 
string s = "12345"; 

//this will throw an exception if s can't be parsed 
int parseVal = int.Parse(s); 

//alternatively: 
int tryVal; 
if(int.TryParse(s, out tryVal)) { 
    //do something with tryVal 
} 

Jeśli skompilować z flagami optymalizacji TryParse jest bardzo szybkie - to najlepszy sposób na uzyskanie liczby z ciągu. Jednak jeśli masz obiekt, który może być int lub może być ciągiem Convert.ToInt32 jest szybszy.

1

Istnieje również metoda DirectCast, z której powinieneś skorzystać tylko wtedy, gdy jesteś pewien, jaki jest typ obiektu. Jest szybszy, ale nie przeprowadza żadnych odpowiednich kontroli. Używam DirectCast, gdy wyodrębniam wartości z luźno wpisanej DataTable, gdy znam typ dla każdej kolumny.

1

Jeśli potrzebujesz prędkości, jestem przekonany, że bezpośrednia obsada jest najszybszą drogą. Mówiąc to, zwykle używam .Parse lub .TryParse, ponieważ wydaje się, że ułatwia czytanie i zachowuje się w bardziej przewidywalny sposób.

Konwertuj faktycznie wywołuje Parse pod maską, jak sądzę. Tak więc jest niewielka różnica, a tak naprawdę wydaje się, że jest to kwestia osobistego gustu.

3

Jestem wielkim fanem TryParse, ponieważ oszczędza ci to dużo bólu głowy, gdy istnieje ryzyko, że wartość, którą zamierzasz przeanalizować, nie jest odpowiedniego typu.

Moje zamówienie jest zwykle:

  • Parse (jeśli mogę mieć pewność, że wartość będzie odpowiedni rodzaj, a ja staram się zapewnić tego)
  • TryParse (jeśli nie mogę być pewny , co się dzieje, gdy dane wejściowe użytkownika jest zaangażowany, lub wejście z systemu nie można kontrolować)
  • Konwersja (które myślę, że nie zostały wykorzystane, ponieważ zacząłem używać analizowania i TryParse, ale mogę się mylić)