2012-06-13 16 views
8

Zobacz następujący kod:TryParse() - Dlaczego ten kod zwraca 0, czy wynik nie powinien wynosić -1?

string test = ""; 
int output = -1; 

if (int.TryParse(test, out output)) 
{ 
    Console.WriteLine("Parsed"); 
} 

Console.WriteLine(output); 

Kiedy TryParse() się nie powiedzie, nie powinien być blok pomijane, nie Console.WriteLine("Parsed") zadzwonił i wartość output być takie same (-1)?

To powrocie 0

+3

Powinieneś używać 'output' tylko wewnątrz' if ', ponieważ tylko wewnątrz niego wiesz, że parsowanie się powiodło. –

Odpowiedz

10

Realizacja TryParsema domyślne parametru out przed powrotem w przeciwnym razie nie będzie skompilować - niezależnie od tego, czy zostały zainicjowane parametr od strony wywołującej out. Jest tak w przypadku metody dowolnej z parametrami out i nie jest ona specyficzna dla TryParse.

Osoby, które je zakodowały wybrały default the parameter to zero, gdy przetwarzanie nie powiedzie się.

Ważną częścią jest nie należy myśleć, że wszelkie out metody parametrów uhonoruje oryginalną wartość parametru out gdy jest przekazywana w W rzeczywistości, to może nigdy zaszczyt parametr jak kompilator zgłosi.

wykorzystanie nieprzypisane out parametru „bla”

Jeśli spróbujesz użyć wartości parametru przed przypisaniem do niego wewnątrz metody. Możesz więc zagwarantować, że dowolna wartość, którą przypiszesz i podasz jako parametr out, zostanie zignorowana/nadpisana.

+0

Dzięki, to ma sens teraz, chociaż na pierwszy rzut oka jest to bardzo mylące. – dtsg

+0

@ Duane Rzeczywiście może tak być, ale wszystko to wynika z użycia parametrów 'out' - innych niż wartość wybrana jako domyślna, nic tutaj nie jest specyficzne dla' TryParse'. –

2

jeśli nie to będzie return false a kod w instrukcji if nie zostanie wykonany.

W przypadku konwersja nie będzie również retun 0 dlatego output=0

15

Od MSDN:

Kiedy ta metoda zwraca, zawiera 32-bitowa wartość całkowita równa liczbie zawartych w ciąg znaków, jeśli konwersja się powiodła, lub zero, jeśli konwersja nie powiodła się.

2

W C#, out należy przypisać parametry i nie można ich początkowo odczytać. (Gdy rozpoczyna się metoda, parametry out są traktowane jak niezainicjowane zmienne.)

Dlatego poprzednia wartość output jest nieistotna. Musiało to zostać zastąpione przez ludzi, którzy napisali metodę TryParse, w przeciwnym razie nie mogliby zostać skompilowani.

W tym samym czasie metoda TryParse nie ma dostępu do poprzedniej wartości output. Dlatego należy wybrać pewną wartość. W tym przypadku the developers chose 0.

Powiązane problemy