C#中如何实现两个密码强度的双重校验?
解决密码强度双重校验的Switch失效问题
你原来的代码之所以无法正常工作,核心问题出在switch的条件判断上:你用了||逻辑运算符,它会把两个GetPasswordStrength()的字符串结果转换成布尔值(true/false),但你的case分支都是字符串类型(比如"Very Weak"),两者完全不匹配,导致代码根本不会进入预期的分支。
下面是可行的实现方案,通过枚举将密码强度转为可比较的数值,取两个密码中的最低强度进行判断,完美实现双重校验的需求:
1. 定义密码强度枚举
首先创建一个枚举,把字符串形式的强度映射成有序的数值,这样方便后续比较:
enum PassStrength { Unchecked = 0, // 枚举建议保留默认初始值,避免未初始化的问题 VeryWeak = 1, Weak = 2, Good = 3, Strong = 4, VeryStrong = 5 }
2. 添加字符串转枚举的转换函数
这个函数用来把原有的字符串强度结果转换成枚举对应的字符串,方便后续解析为枚举值:
public string GetPasswordStrenght1() { string valor = GetPasswordStrength(); switch(valor) { case "Very Weak": return Convert.ToString(PassStrength.VeryWeak); case "Weak": return Convert.ToString(PassStrength.Weak); case "Good": return Convert.ToString(PassStrength.Good); case "Strong": return Convert.ToString(PassStrength.Strong); case "Very Strong": return Convert.ToString(PassStrength.VeryStrong); default: return Convert.ToString(PassStrength.Unchecked); } }
3. 双重校验的主逻辑
获取两个密码的强度枚举值,取其中最低的强度进行判断,只要有一个密码强度不达标(低于Good)就触发错误提示:
pwdStrength.SetPassword(text_passmysql.Text); pwdStrength1.SetPassword(text_adminpass.Text); // 将字符串形式的强度解析为枚举值 PassStrength strSql = (PassStrength)Enum.Parse(typeof(PassStrength), pwdStrength.GetPasswordStrenght1()); PassStrength strAdm = (PassStrength)Enum.Parse(typeof(PassStrength), pwdStrength1.GetPasswordStrenght1()); // 取两个密码中强度最低的那个 PassStrength lowest = (PassStrength)Math.Min((Int32)strSql, (Int32)strAdm); // 判断最低强度是否低于"Good"级别 if ((Int32)lowest < (Int32)PassStrength.Good) { MessageBox.Show("A password do MySQL é muito fraca, escolha um mais forte.\nApenas pode alterar a password MySQL para uma mais forte, caso contrário não será guardada.", "Configurações do Programa", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { // 执行后续操作 // do something }
这个方案的核心是利用枚举的数值特性来直观比较密码强度,确保只要两个密码中有一个强度不达标,就会触发错误提示,完全满足双重校验的需求。
内容的提问来源于stack exchange,提问作者Karbust
相关产品推荐
相关产品推荐

