【问题标题】:Optimize constructor overloading in C# [duplicate]优化 C# 中的构造函数重载 [重复]
【发布时间】:2017-07-26 14:50:53
【问题描述】:

我有一个带有以下构造函数的 Winforms 应用程序:

public Form1()
{
  InitializeComponent();
 //Code that enables/disables buttons etc
}

public Form1(int ID)
{
  searchByID = ID;
  InitializeComponent();
 //Code that enables/disables buttons etc
}

选择哪一个?这取决于程序是否由 CMD 启动并添加了参数。这是检查的主要内容:

static void Main(string[] args)
{
            //Args will be the ID passed by a CMD-startprocess (if it's started by cmd of course

            if (args.Length == 0)
            {
                Application.Run(new Form1());
            }
            else if(args.Length>0)
            {
                string resultString = Regex.Match(args[0], @"\d+").Value;
                incidentID = Int32.Parse(resultString);
                try
                {
                    Application.Run(new Form1(incidentID));
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());

                }
            }
}

我的问题是:

如何优化构造函数?它们都包含大约 30 行与相同代码一样好的代码,我想通过这样做来解决这个问题:

  public Form1()
    {
        Form1(0)
    }


 public Form1(int ID)
 {
       if (ID>0)
    {
       //it has an ID
    }else
    {
       doesn't have an ID
    }
 }

但这给了我错误:

不可调用的成员不能像方法一样使用。

如何优化?

【问题讨论】:

  • 这里的关键字是“链接”而不是“重载”
  • 尽量在构造函数中包含尽可能少的逻辑。除了分配变量之外,没有其他逻辑是可接受的。
  • 谢谢本德。我的构造函数没有逻辑。仅链接事件处理程序、隐藏/显示按钮等。我认为这是正确的

标签: c# constructor constructor-overloading


【解决方案1】:

你需要做的是:

public Form1() : this(0)
{
}

public Form1(int ID)
{
    if (ID>0)
    {
        //it has an ID
    }
    else
    {
        //doesn't have an ID
    }
}

这被称为将构造函数链接在一起 - 所以: this(0) 的意思是“在你在这个构造函数中运行代码之前,调用另一个并传递“0”作为它的参数”

【讨论】:

  • 谢谢!但是我会把第一个构造函数完全留空吗?我的主要功能不需要编辑吗?
  • 由于这已被标记为重复,您可能会在该问题上找到答案 =)
  • 谢谢,链接的问题并没有解释我第一个修复它的建议出了什么问题,因为提问者没有像我这样的错误......
  • 啊,好的。好吧,在您的解决方案中,您尝试自己直接调用另一个构造函数(您有Form1(0)),这是不允许的,因此您得到了错误。通过“特殊大小写”从另一个(到: this(0))调用一个构造函数的语法,它确保了另一个构造函数总是被调用 first - 即你不能选择你的构造函数的位置/时间打电话给另一个人
  • 非常感谢 Rob 的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多