使用我的代码是不错的做法? 我的代码,基本上生成一个长度为10(当前)的密码,并根据选中的复选框生成密码: 复选框: - 特殊字符 - 数字 - 大写字母
bool c_special = false;
bool c_numbers = false;
bool c_capitals = false;
private void btn_generate_Click(object sender, RoutedEventArgs e)
{
checkCheckboxes();
if(c_special && c_numbers && c_capitals)
{
txt_password.Text = generateWithCharactersAndNumbersAndCapitals(10);
}
else if(c_special && c_numbers && !c_capitals)
{
txt_password.Text = generateWithCharactersAndNumbers(10);
}
else if(c_special && !c_numbers && c_capitals)
{
txt_password.Text = generateWithCharactersAndCapitals(10);
}
else if(c_special && !c_numbers && !c_capitals)
{
txt_password.Text = generateWithCharacters(10);
}
else if(!c_special && c_numbers && !c_capitals)
{
txt_password.Text = generateWithNumbers(10);
}
else if(!c_special && c_numbers && c_capitals)
{
txt_password.Text = generateWithNumbersAndCapitals(10);
}
else if(!c_special && !c_numbers && c_capitals)
{
txt_password.Text = generateWithCapitals(10);
}
else if(!c_special && !c_numbers && !c_capitals)
{
txt_password.Text = generateNormalPassword(10);
}
}
/*
* Checks which checkboxes are checked
*/
private void checkCheckboxes()
{
if (cbox_special.IsChecked == true)
{
c_special = true;
}
else
{
c_special = false;
}
if (cbox_numbers.IsChecked == true)
{
c_numbers = true;
}
else
{
c_numbers = false;
}
if (cbox_capitals.IsChecked == true)
{
c_capitals = true;
}
else
{
c_capitals = false;
}
}
//Normal
public string generateNormalPassword(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyz";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
//Characters
public string generateWithCharacters(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyz!@#$%^&*";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
public string generateWithCharactersAndNumbers(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
public string generateWithCharactersAndCapitals(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyz!@#$%^&*ABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
public string generateWithCharactersAndNumbersAndCapitals(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyz!@#$%^&*ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
//Numbers
public string generateWithNumbers(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
public string generateWithNumbersAndCapitals(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
//Capitals
public string generateWithCapitals(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
private void btn_cancel_Click(object sender, RoutedEventArgs e)
{
MainWindow mw = new MainWindow();
mw.Show();
this.Hide();
}
}
}
我正在努力学习比这更好的练习,我很想知道你的意见我是如何做到这一点的,以及在哪里和如何改进。
答案 0 :(得分:1)
您的代码现在有很多重复。主要是,此部分在所有generate...
方法中共享:
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
只有字符串valid
不同。
减少这种重复的一种方法是使用一个带有标志参数的generate
方法:
// rnd should be at class level so you don’t create a new one every time
Random rnd = new Random();
public string generateWith(int length, bool capitals, bool numbers, bool symbols) {
string valid = "abcdefghijklmnopqrstuvwxyz";
if (capitals) { // add the capitals to 'valid' }
if (numbers) { // add the numbers to 'valid' }
if (symbols) { // add the symbols to 'valid' }
StringBuilder res = new StringBuilder();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
然后您只需将变量c_special
,c_numbers
和c_capitals
传递给此方法:
generateWith(10, capitals: c_capitals, numbers: c_numbers, symbols: c_special);