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]
方括号([ 和 ])中的项是可选的;其他项的值如下所示。
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 参数包含一个如下形式的数字:
[ws][sign]digits[ws]
方括号([ 和 ])中的项是可选的;其他项的值如下所示。
s 参数是使用针对当前系统区域性初始化的 NumberFormatInfo 中的格式设置信息分析的。