作Winform界面的时候,上面有六个文本框须要判空,以前的思路大体是这样的,代码以下:spa
1 if (txtUserName.Text.Trim() == "") 2 { 3 MessageBox.Show("用户名不能够为空!", "舒适提示"); 4 txtUserName.Focus(); 5 } 6 else if (txtPassword.Text.Trim() == "") 7 { 8 MessageBox.Show("密码不能够为空!", "舒适提示"); 9 txtPassword.Focus(); 10 } 11 else if (txtConfirmPassword.Text.Trim() == "") 12 { 13 MessageBox.Show("确认密码不能够为空!", "舒适提示"); 14 txtConfirmPassword.Focus(); 15 } 16 else 17 { 18 MessageBox.Show("注册成功!", "舒适提示"); 19 }
代码中写了三个判断,大概就是作一个注册功能时所须要作的判空操做。但是,当我界面有六个文本框须要判空时,就以为有点麻烦了,还要加三个if else判断。因而,就想能不能将判空操做提取出一个方法来进行呢,这样至少代码看起来不会那么冗余。因而,就有了下面的代码:code
1 bool isEmpty = CheckEmpty(txtUserName, txtPassword, txtConfirmPassword); 2 if (isEmpty) 3 { 4 MessageBox.Show("注册成功!", "舒适提示"); 5 }
7 /// <summary> 8 /// 自定义方法,判断某文本框是否为空 9 /// </summary> 10 /// <param name="txt">要进行判断的标签</param> 11 /// <returns>是否全都不为空</returns> 12 public bool CheckEmpty(params TextBox[] txt) 13 { 14 bool flag = true; 15 for (int i = 0; i < txt.Length; i++) 16 { 17 if (txt[i].Text.Trim() == "") 18 { 19 string name = txt[i].Name; 20 //将name转换为对应label的值 21 name = Change(name); 22 MessageBox.Show(name + "不能够为空,请从新输入!","舒适提示"); 23 txt[i].Focus(); 24 flag = false; 25 break; 26 } 27 } 28 return flag; 29 } 30 31 /// <summary> 32 /// 将文本框Name值转换成对应的Label文本 33 /// </summary> 34 /// <param name="name"></param> 35 /// <returns></returns> 36 private string Change(string name) 37 { 38 switch (name) 39 { 40 case "txtUserName": 41 name = "用户名"; 42 break; 43 case "txtPassword": 44 name = "密码"; 45 break; 46 case "txtConfirmPassword": 47 name = "确认密码"; 48 break; 49 default: 50 break; 51 } 52 return name; 53 }
这样一来,判空的代码看起来就清晰多了,将须要判空的文本框当作参数传过去便可。不过,又有一个问题,咱们能够看到,Change方法中将文本框Name属性值转换为对应的label文本时,每添加一个判断,必需要增长一个case,这样一来,若是有一百个判断,那代码就太长了。那么,有没有一种方法,便可以替代Switch….Case又能够缩短代码行呢?答案是:有的,用Dictionary来代替。代码以下:orm
1 /// <summary> 2 /// 将文本框Name值转换成对应的Label文本 3 /// </summary> 4 /// <param name="name"></param> 5 /// <returns></returns> 6 private string Change(string name) 7 { 8 Dictionary<string, string> myDic = new Dictionary<string, string>(); 9 myDic.Add("txtUserName", "用户名"); 10 myDic.Add("txtPassword", "密码"); 11 myDic.Add("txtConfirmPassword", "确认密码"); 12 return myDic[name]; 13 }
咱们能够看到,Dictionary实现了同Switch同样的功能,代码从15行变成了5行,并且Switch每增长一个判断,须要增长三行代码,而Dictionary只需增长一行代码便可。到如今为止,判断这个操做看起来算是不那么麻烦了。咱们知道,优秀的代码通常都是可扩展,可复用的。而目前,上面的代码并无作到可复用。CheckEmpty方法中须要用到Change方法来转换提示信息,而Change方法中的字典是写死的。这个时候,若是想复用CheckEmpty方法就必须将Change方法拿掉,将其当作参数传过来。代码以下:blog
1 bool isEmpty = CheckEmpty(TopMessage(), txtUserName, txtPassword, txtConfirmPassword); 2 if (isEmpty) 3 { 4 MessageBox.Show("注册成功!", "舒适提示"); 5 } 6 7 /// <summary> 8 /// 提示信息转换 9 /// </summary> 10 /// <returns></returns> 11 private Dictionary<string, string> TopMessage() 12 { 13 Dictionary<string, string> myDic = new Dictionary<string, string>(); 14 myDic.Add("txtUserName", "用户名"); 15 myDic.Add("txtPassword", "密码"); 16 myDic.Add("txtConfirmPassword", "确认密码"); 17 return myDic; 18 } 19 20 /// <summary> 21 /// 自定义方法,判断某文本框是否为空 22 /// </summary> 23 /// <param name="txt">要进行判断的标签</param> 24 /// <returns>是否全都不为空</returns> 25 public bool CheckEmpty(Dictionary<string,string> myDic,params TextBox[] txt) 26 { 27 bool flag = true; 28 for (int i = 0; i < txt.Length; i++) 29 { 30 if (txt[i].Text.Trim() == "") 31 { 32 string name = txt[i].Name; 33 //将name转换为对应label的值 34 name = myDic[name]; 35 MessageBox.Show(name + "不能为空,请从新输入","舒适提示"); 36 txt[i].Focus(); 37 flag = false; 38 break; 39 } 40 } 41 return flag; 42 }
这样,CheckEmpty方法就能够复用了。在Web应用中,文本框是有一个属性能够设置是否容许为空的,不过Winform好像尚未,以为有必要也加上。以上只是我的思考,若有不当或可改进之处,还望不吝赐教。string