C# 限制代码量

本文关键字:代码 | 更新日期: 2023-09-27 18:19:33

private void txtOctet1_TextChanged(object sender, EventArgs e)
        {
            double numCheck1;
            if (txtOctet1.Text == "")
            {
            }
            else
            {
                numCheck1 = Convert.ToDouble(txtOctet1.Text);
                if (numCheck1 < 0 | numCheck1 > 255)
                {
                    btnSubnetting.Enabled = false;
                    lblOctet1Error.Text = "Error";
                    lblOctet1Error.BackColor = Color.Red;
                    lblOctet1Error.ForeColor = Color.White;
                }
                else
                {
                    btnSubnetting.Enabled = true;
                    lblOctet1Error.Text = "No Error";
                    lblOctet1Error.BackColor = Color.White;
                    lblOctet1Error.ForeColor = Color.Black;
                }
            }
        }

我已经在 C# 中制作了一个十进制到二进制转换器。这个用户是我做的一个类。用户在四个文本框中输入他们的"IP地址"(每个八位字节一个(。上面的代码确实有效,但我不想为其他第三个八进制输入文本框重复上述代码。我将如何管理它(如果可能的话(

C# 限制代码量

与其向您展示解决方案,不如让我们玩一下VS

1. 引入两个保存文本框和标签引用的变量,并替换下面的所有用法:

private void txtOctet1_TextChanged(object sender, EventArgs e)
{
    double numCheck1;
    TextBox txtToValidate = txtOctet1; // Variable 1
    Label lblError = lblOctet1Error; // Variable 2
/* Select from here in the next step */ 
    if (txtToValidate.Text == "") // Here, txtOctet1 replaced
    {
    }
    else
    {
        numCheck1 = Convert.ToDouble(txtToValidate.Text); // Here, txtOctet1 replaced
        if (numCheck1 < 0 | numCheck1 > 255)
        {
            btnSubnetting.Enabled = false;
            lblError.Text = "Error"; // Here, lblOctet1Error replaced
            lblError.BackColor = Color.Red; // Here, lblOctet1Error replaced
            lblError.ForeColor = Color.White; // Here, lblOctet1Error replaced
        }
        else
        {
            btnSubnetting.Enabled = true;
            lblError.Text = "No Error"; // Here, lblOctet1Error replaced
            lblError.BackColor = Color.White; // Here, lblOctet1Error replaced
            lblError.ForeColor = Color.Black; // Here, lblOctet1Error replaced
        }
    }
/* Select to here in the next step */ 
}

暂时没有进展

2. 选择要重复使用的代码

用鼠标或键盘,选择我放置的两个注释占位符之间的所有代码。基本上,您应该已经完成了最外层的if/else语句。

3.a 提取到方法

右键单击选择代码,选择RefactorExtract to a method

为您的方法选择一个名称,例如 ValidateOctet。

驗證。您应该已在自定义方法中提取逻辑:

private void txtOctet1_TextChanged(object sender, EventArgs e)
{
    double numCheck1;
    TextBox txtToValidate = txtOctet1; // Variable 1
    Label lblError = lblOctet1Error; // Variable 2
    ValidateOctet(txtToValidate, lblError);
    }
    private void ValidateOctet(TextBox txtToValidate, Label lblError)
    {
    if (txtToValidate.Text == "") // Here, txtOctet1 replaced
    {
    }
    else
    {
        numCheck1 = Convert.ToDouble(txtToValidate.Text); // Here, txtOctet1 replaced
        if (numCheck1 < 0 | numCheck1 > 255)
        {
            btnSubnetting.Enabled = false;
            lblError.Text = "Error"; // Here, lblOctet1Error replaced
            lblError.BackColor = Color.Red; // Here, lblOctet1Error replaced
            lblError.ForeColor = Color.White; // Here, lblOctet1Error replaced
        }
        else
        {
            btnSubnetting.Enabled = true;
            lblError.Text = "No Error"; // Here, lblOctet1Error replaced
            lblError.BackColor = Color.White; // Here, lblOctet1Error replaced
            lblError.ForeColor = Color.Black; // Here, lblOctet1Error replaced
        }
    }    
}

仍然没有明显的进展

3.b(可选(删除无用的变量

我选择通过删除我们之前创建的变量来简化代码。我可以直接使用文本框和标签引用调用该方法。选择是否保留变量是代码样式的问题。

private void txtOctet1_TextChanged(object sender, EventArgs e)
{
    double numCheck1;
    ValidateOctet(txtOctet1, lblOctet1Error);
    }

4. 对所有文本框重用该方法

只需为所有文本框/标签键入ValidateOctet

private void txtOctet1_TextChanged(object sender, EventArgs e)
{
    double numCheck1;
    ValidateOctet(txtOctet1, lblOctet1Error);
    ValidateOctet(txtOctet2, lblOctet2Error);
    ValidateOctet(txtOctet3, lblOctet3Error);
    ValidateOctet(txtOctet4, lblOctet4Error);
    }

进度:您现在可以在一个地方定义逻辑

5. 可能的优化

  1. 看看别人的回答。有些人可能会帮助你。
  2. 有一个System.Net.IPAdress类。这提供了一组处理IP地址的方法(特别是TryParse方法(。
  3. 不知道您的业务需求,但您的代码不支持 IP V6。我们(至少(即将部署IP V6。也许您应该只使用一个文本框 + IPAddress 类以避免将来的限制。
  4. 如果您打算有多个 IP 地址字段,则应考虑将所有 UI 和逻辑包装在可重用的用户控件中。

免責聲明

请不要说我的回答不是为了找到更好的解决方案,而是帮助您使用Visual Studio及其重构功能。从简单的东西开始,到原型,或者在实际实现之前玩一点是很常见的。重构工具允许简单地重新设计代码的某些部分。

将代码提取到传递控件的帮助程序方法中。

依次为每个控件调用此方法。

编写一个方法/函数并在每个 TextChange 方法中调用它;您必须将 TextField 作为参数传递以设置颜色/错误。

创建一个接受文本框和标签的方法,并为每组文本框/标签调用该方法一次。

(后续示例(

可以将相同的 TextChanged 事件附加到所有文本框。生成事件的框将位于 sender 参数中,因此您可以在事件中像这样TextBox txtOctet = (TextBox)sender;获取它。

或者,您可以只使用一个文本框,这就是我们所做的。这有两个优点。您也可以在那里键入 IPv6 地址,只需使用标准函数解析地址即可完成验证。我们像这样验证地址:

IPAddress address = null;
IPAddress.TryParse(txtIP.Text, out address);
    if(address == null)
    {
        // Set error...
    }