C#限制代码量

标签 c# validation textbox

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# 做了一个十进制到二进制的转换器。这使用了我制作的类(class)。用户在四个文本框中输入他们的“IP 地址”(每个八位组一个)。上面的代码确实有效,但我不想为其他第三个 Octet 输入文本框重复上面的代码。我将如何管理这个(如果可能的话)

最佳答案

与其向您展示解决方案,不如让我们稍微玩一下 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 (Optionnal) 移除无用的变量

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

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 class .这提供了一组使用 IP 地址(特别是 TryParse method )的方法。
  3. 不知道您的业务需求,但您的代码不支持 IP V6。我们即将(至少)部署 IP V6。也许您应该只使用一个文本框 + IPAddress 类以避免将来的限制。
  4. 如果您打算有多个 IP 地址字段,您应该考虑将所有 UI 和逻辑包装在一个 reusable UserControl 中。 .

免责声明

请注意,我的回答并非旨在找到更好的解决方案,而是帮助您使用 Visual Studio 及其重构功能。从简单的事情开始,制作原型(prototype),或者在实际实现之前试一下是很常见的。重构工具允许简单地重新设计代码的某些部分。

关于C#限制代码量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8759597/

相关文章:

c# - 使用 C++/CLI 将图片插入 Excel 并收到 100x 警告 C4691

c# - 使用 C# 创建桌面快捷方式以添加主目录路径

c# - 在 ListView 顶部添加 "Loading"-image

objective-c - 在 Interface Builder 中进行了更改,Xcode 没有显示它

java - 概念问题 - 具有选择性输入的文本框

c# - 扩展方法 : IXmlLineInfo 出现问题

javascript - 如何验证传递对象的值

ruby - 为什么我不能在控制台中检查 ActiveRecord 验证?

apache - 在Apache wicket中使用自定义验证框架/对象处理反馈消息

java - 更新文本区域