int.Parse()方法与int.TryParse()的思考

今天学习了一个简单的加法计算器的winform程序,这里面学到的两个知识点还挺重要的,第一个就是int.Parse()与int.TryParse方法的区别

先做了一个winform程序界面如下:

具体的功能是输入两个整数然后输出相加的结果,杨老师课上讲有两种方法,可以用Parse()方法也可以用TryParse()方法,老师用的是TryParse()方法。

 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 namespace WindowsFormsTest
11 {
12 public partial class Form1 : Form
13 {
14 public Form1()
15 {
16 InitializeComponent();
17 }
18
19 private void btnCompute_Click(object sender, EventArgs e)
20 {
21 string firstNum = txtFirstNum.Text;
22 string secondNum = txtSecNum.Text;
23 int i1, i2;
24 if (int.TryParse(firstNum, out i1) == false)
25 {
26 MessageBox.Show("第一个数不是合法的整数");
27 return;
28 }
29 if (int.TryParse(secondNum, out i2) == false)
30 {
31 MessageBox.Show("第二个数不是合法的整数");
32 return;
33 }
34
35 int result = i1 + i2;
36 txtResult.Text = Convert.ToString(result);
37 }
38 }
39 }

程序运行结果:

 

如果输入一个不是数字的非法值,那么会弹出一个提示对话框如下:

 程序运行ok,然后查阅了一下msdn文档,方法介绍如下:

Int32.TryParse 方法 (String, Int32)

将数字的字符串表示形式转换为它的等效 32 位有符号整数。一个指示操作是否成功的返回值。

命名空间:  System
程序集:  mscorlib(在 mscorlib.dll 中)

语法:

public static bool TryParse(
	string s,
	out int result
)

参数

s
类型:System.String

包含要转换的数字的字符串。

result
类型:System.Int32

当此方法返回时,如果转换成功,则包含与 s 所包含的数字等效的 32 位有符号整数值;如果转换失败,则包含零。如果 s 参数为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),格式不正确,或者表示的数字小于 MinValue 或大于 MaxValue,则转换会失败。该参数未经初始化即被传递。

返回值

类型:System.Boolean

如果 s 转换成功,则为 true;否则为 false。

TryParse 方法类似于 Parse 方法,不同之处在于 TryParse 方法在转换失败时不引发异常。

s 参数包含一个如下形式的数字:

[ws][sign]digits[ws]

方括号([ 和 ])中的项是可选的;其他项的值如下所示。

ws

可选的空白。

sign

一个可选符号。

digits

一系列从 0 到 9 之间的数字。

s 参数是使用针对当前系统区域性初始化的 NumberFormatInfo 对象中的格式设置信息分析的。

 

msdn文档中说用TryParse()方法的话在转换参数失败时不会抛出异常,我想这是和Parse()最大的区别,也是TryParse方法的优点吧。

下面就验证一下Parse()方法执行情况。

 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 namespace WindowsFormsTest
11 {
12 public partial class Form1 : Form
13 {
14 public Form1()
15 {
16 InitializeComponent();
17 }
18
19 private void btnCompute_Click(object sender, EventArgs e)
20 {
21 string firstNum = txtFirstNum.Text;
22 string secondNum = txtSecNum.Text;
23 int i1, i2;
24 i1 = int.Parse(firstNum);
25 i2 = int.Parse(secondNum);
26 int result = i1 + i2;
27 txtResult.Text = Convert.ToString(result);
28 }
29 }
30 }

假如在第一个文本框中输入一个非法值a,程序出抛出一个异常如下:

看来果真会报出异常,如果用try catch代码块捕捉异常应该就可以解决了

 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 namespace WindowsFormsTest
11 {
12 public partial class Form1 : Form
13 {
14 public Form1()
15 {
16 InitializeComponent();
17 }
18
19 private void btnCompute_Click(object sender, EventArgs e)
20 {
21 string firstNum = txtFirstNum.Text;
22 string secondNum = txtSecNum.Text;
23 int i1, i2;
24
25 try
26 {
27 i1 = int.Parse(firstNum);
28 }
29 catch (Exception ex)
30 {
31 MessageBox.Show(ex.Message);
32 return;
33 }
34 try
35 {
36 i2 = int.Parse(secondNum);
37 }
38 catch (Exception ex)
39 {
40 MessageBox.Show(ex.Message);
41 return;
42 }
43 int result = i1 + i2;
44 txtResult.Text = Convert.ToString(result);
45 }
46 }
47 }

程序再次运行ok,但是程序因此也变得不优雅了,很多try catch毕竟不是很好,所以可以看出还是TryParse()方法比较好呵呵。

再来看一下Parse()方法说明:

Int32.Parse 方法 (String)

将数字的字符串表示形式转换为它的等效 32 位有符号整数。

语法:

public static int Parse(
	string s
)

参数

s
类型:System.String

包含要转换的数字的字符串。

返回值

类型:System.Int32

与 s 中包含的数字等效的 32 位有符号整数。

异常条件
ArgumentNullException

s 为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。

FormatException

s 不是仅由一个可选负号后跟一系列从 0 到 9 的数字组成的。

OverflowException

s 表示小于 MinValue 或大于 MaxValue 的数字。

备注

s 参数包含一个如下形式的数字:

[ws][sign]digits[ws]

方括号([ 和 ])中的项是可选的;其他项的值如下所示。

ws

可选的空白。

sign

一个可选符号。

digits

一系列从 0 到 9 之间的数字。

s 参数是使用针对当前系统区域性初始化的 NumberFormatInfo 中的格式设置信息分析的。

posted @ 2011-12-16 08:34  keepLearning...  阅读(736)  评论(0编辑  收藏  举报