C#使用复选框并生成这样的密码的好习惯?

时间:2018-05-27 20:22:16

标签: c#

使用我的代码是不错的做法? 我的代码,基本上生成一个长度为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();
    }
}
}

我正在努力学习比这更好的练习,我很想知道你的意见我是如何做到这一点的,以及在哪里和如何改进。

1 个答案:

答案 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_specialc_numbersc_capitals传递给此方法:

generateWith(10, capitals: c_capitals, numbers: c_numbers, symbols: c_special);
相关问题