Parse v. TryParse
Asked Answered
P

8

122

What is the difference between Parse() and TryParse()?

int number = int.Parse(textBoxNumber.Text);

// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);

Is there some form of error-checking like a Try-Catch Block?

Psychologism answered 22/1, 2009 at 0:16 Comment(0)
F
174

Parse throws an exception if it cannot parse the value, whereas TryParse returns a bool indicating whether it succeeded.

TryParse does not just try/catch internally - the whole point of it is that it is implemented without exceptions so that it is fast. In fact the way it is most likely implemented is that internally the Parse method will call TryParse and then throw an exception if it returns false.

In a nutshell, use Parse if you are sure the value will be valid; otherwise use TryParse.

Fante answered 22/1, 2009 at 0:20 Comment(5)
"internally the Parse method will call TryParse" Except that Parse pre-dates TryParse by several versions. Of course, they could have moved the core implementation to TryParse...Aminopyrine
@Joel - I assumed they would have moved the implementation, but I just had a look with reflector and they are separate implementations with exactly the same code other than one has 'throw ...' and one has 'return false'. I wonder why they aren't consolidated?!Fante
Although, thinking about it, Parse throws a number of different exceptions so if all it had was a bool from TryParse then it wouldn't know which one to throw.Fante
"use Parse if you are sure the value will be valid". I'd add, "but you acknowledge the possibility you might be wrong". If you were 100% sure it can parse, then you could just as correctly use TryParse which might be faster.Vaso
And by "different exceptions", @GregBeech means the message, not the class.Showalter
D
33

If the string can not be converted to an integer, then

  • int.Parse() will throw an exception
  • int.TryParse() will return false (but not throw an exception)
Deflection answered 22/1, 2009 at 0:18 Comment(2)
What if I use int.TryParse(some_method_that_throws_exception(), out int test)? Will it catch any exception or only the ones related to parsing?Killiecrankie
@AlexandruAntochi You should not ask a question as a comment. This will make it almost impossible for others to benefit from useful answers. However, to make it worth your while, the answer to your question is no, int.TryParse will not throw at all. If the method fail to parse, it will only reflect this by a return value of false. This makes it convenient to use if(int.TryParse… to only do something if the parse succeeds.Hobby
D
4

The TryParse method allows you to test whether something is parseable. If you try Parse as in the first instance with an invalid int, you'll get an exception while in the TryParse, it returns a boolean letting you know whether the parse succeeded or not.

As a footnote, passing in null to most TryParse methods will throw an exception.

Darkroom answered 22/1, 2009 at 0:18 Comment(1)
Passing null to basic types (int, double, DateTime, etc.) will NOT throw an exceptionSweatbox
M
4

TryParse and the Exception Tax

Parse throws an exception if the conversion from a string to the specified datatype fails, whereas TryParse explicitly avoids throwing an exception.

Majka answered 22/1, 2009 at 0:23 Comment(2)
TryParse will throw an exception if you pass null in for most integral TryParse methods.Darkroom
Great link. I am surprised that no one hasn't yet started the "which one is best or which coding practice should be applied" discussion.Cohla
P
0

TryParse does not return the value, it returns a status code to indicate whether the parse succeeded (and doesn't throw an exception).

Phenetidine answered 22/1, 2009 at 0:19 Comment(1)
TryParse does return the value through parameter two which is specified with the out keyword.Cohla
O
0

For the record, I am testing two codes: That simply try to convert from a string to a number and if it fail then assign number to zero.

        if (!Int32.TryParse(txt,out tmpint)) {
            tmpint = 0;
        }

and:

        try {
            tmpint = Convert.ToInt32(txt);
        } catch (Exception) {
            tmpint = 0;
        }

For c#, the best option is to use tryparse because try&Catch alternative thrown the exception

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll

That it is painful slow and undesirable, however, the code does not stop unless Debug's exception are settled for stop with it.

Ocarina answered 18/2, 2012 at 16:43 Comment(1)
The first code snippit doesn't do anything, since tmpint will already be set to zero if the string is not able to be parsed as an int.Rozina
L
0

I know its a very old post but thought of sharing few more details on Parse vs TryParse.

I had a scenario where DateTime needs to be converted to String and if datevalue null or string.empty we were facing an exception. In order to overcome this, we have replaced Parse with TryParse and will get default date.

Old Code:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");

New Code:

DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);

Have to declare another variable and used as Out for TryParse.

Liatrice answered 31/5, 2017 at 9:13 Comment(2)
You don't need to initialize startDate and endDate as DateTime.TryParse will always overwrite them with DateTime.MinValue. If incorrect date representations should be converted to a different value, check the return value of DateTime.TryParse and if it is false, set the value explicitly.Typhus
Using DateTime? (DateTime nullable)Migrate
M
-1

double.Parse("-"); raises an exception, while double.TryParse("-", out parsed); parses to 0 so I guess TryParse does more complex conversions.

Midvictorian answered 22/7, 2011 at 0:58 Comment(1)
But does TryParse return true or false? That's how you'll know if it was "valid".Showalter

© 2022 - 2024 — McMap. All rights reserved.