VS
提供了一个模版“控制台应用程序”,这种应用程序主要不是用来与用户交互的,或做一些后台程序运行的展示,或用来练习
C#
语法,如果当做
C#
语法学习的平台,在这里就说一下在控制台下的输入验证吧。
控制台状态下,程序的输入输出是流的方式进行的,也就是光标是向前的(如果不做特殊处理的话),输入的验证,只能等用户输入完后,系统从缓冲区中把数据读出来进行验证(因为在这里没有按键事件)。举个例子吧,比如,我们提示用户从控制台上输入一个数字类型(如果是字符或字符串类型,问题就会少一点,因为
Console.ReadLine
或
Console.Read
方法,是返回字符串和字符的),拿年龄来说明问题吧。
最直接的验证是这样的:
Console.WriteLine("
请输入年龄:"
);
string agestr = Console.ReadLine();
int age;
if (int.TryParse(agestr, out age))
{
Console.WriteLine("
你输入的年龄:"
, age);
}
else
{
Console.WriteLine("
你输入的年龄有误!"
);
}
我们利用类型
.TryParse
方法,来试图去转换一个类型,
int.TryParse
是试图把字符串转换成整型,当然,这个字符串必需是数字的字符串,这样才能转换成功,否则是不成功的,返回值是为
false
的,所以利用这点,就可以验证用户输入的年龄类型正确与否。其实上面写法还是复杂一点,于是就要简化一下,如下代码:
Console.WriteLine("
请输入年龄:"
);
string agestr = Console.ReadLine();
int age = int.TryParse(agestr, out age) ? age : 1;
Console.WriteLine("
年龄为:{0}"
, age);
用三元运算符可以在一定程度减少了代码量,但与之前不一样的是,在这里如果用户输入年龄有误,就会给一个默认值。
上面这两种做法都还行,能起一定的效果,但最大的依赖是
TryParse
,这样在业务逻辑上有一点别扭,是通过一个方法来验证类型的。
其实用更好的办法,如下:
Regex reg = new Regex(@"^\d+$");//
重复一次或多次
Console.WriteLine("
请输入年龄:"
);
string agestr = Console.ReadLine();
if (reg.Match(agestr).Success)
{
Console.WriteLine("
年龄是:{0}"
, agestr);
}
else
{
Console.WriteLine("
输入的年龄有误"
);
}
正则表达式,它能很好解决这个问题,这里不是在讨论正则表达式,关于它的学习,请参考相关文档,在这里主要说明,在语言中引用这个技术,在很大程度上解决了数据的安全性,有效性。
比如,我们都知道,年龄,特别是人的年龄,是在
0
到
150
,没有负数,也没有见过超过
150
岁的人,如果前两段代码做的话,那就是分段验证,前面验证是否为整型,后面验证是否在
0
到
150
岁之间,如果用正则,只需要如下变化:
Regex
reg = new Regex(@"^\d$|^\d{2}$|^1[0-4]\d$|^150$");
只要一次的验证,改正则表达式,就能答到数据的验证。
提倡用正则,但正则一般学习和理解起来有一点难度,这就是双刃剑。