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("输入的年龄有误");
        }
正则表达式,它能很好解决这个问题,这里不是在讨论正则表达式,关于它的学习,请参考相关文档,在这里主要说明,在语言中引用这个技术,在很大程度上解决了数据的安全性,有效性。
比如,我们都知道,年龄,特别是人的年龄,是在0150,没有负数,也没有见过超过150岁的人,如果前两段代码做的话,那就是分段验证,前面验证是否为整型,后面验证是否在0150岁之间,如果用正则,只需要如下变化:
Regex reg = new Regex(@"^\d$|^\d{2}$|^1[0-4]\d$|^150$");
只要一次的验证,改正则表达式,就能答到数据的验证。
提倡用正则,但正则一般学习和理解起来有一点难度,这就是双刃剑。