在同一类中从另一个构造函数调用构造函数

8

我有一个带有两个构造函数的类(C#)。以下是代码片段:

public class FooBar()
{
    public FooBar(string s)
    {
        // constructor 1, some functionality
    }

    public FooBar(int i) : this("My String")
    {
        // constructor 2, some other functionality
    }

}

是的,我知道我可以使用上述方法从一个构造函数调用另一个构造函数。但在这种情况下,如果我调用构造函数2,则在执行构造函数2中的语句之前,构造函数1中的所有语句都将运行。
我的要求是,在执行构造函数2中的所有语句之后,才会调用构造函数1。
在我的具体情况中,我正在进行用户身份验证。构造函数1仅使用用户ID检索用户信息,而构造函数2则使用电子邮件和密码进行用户身份验证。如果用户存在于数据库中,则获取用户ID,现在我希望构造函数1填充类的所有属性。
请让我知道您是否需要其他信息。如果您认为还有其他更好的方法,请告诉我,我很乐意听取建议。
更新1: 我想知道为什么没有实现类似以下的内容:
public FooBar(bool b)
{
    // constructor 3, some more functionality
    this.FooBar("My String"); // calling constructor 1
}

2
有趣的场景。你可以将功能移动到一个单独的函数中,或者创建一个重载的构造函数 FooBar(string s, int i)。这可能不是最好的解决方案,但只是提出一些想法。 - Justin
@Justin,把逻辑放在另一个方法中似乎是一个更好的想法。谢谢。 - Farhan
5个回答

8
在这种情况下,不要使用构造函数调用,而是使用类似以下的语法:
public class FooBar()
{
    public FooBar(string s)
    {
        Init1();
    }

    public FooBar(int i)
    {
        Init2(); 
        Init1();
    }

}

我认为Init1(..)Init2(..)是与相应构造函数的某些特定初始化逻辑相关的方法。

实际上,您可以按照更符合您需求的方式安排这些函数调用。


8
你可以使用另一个私有方法来进行初始化:
public class FooBar()
{
    public FooBar(string s)
    {
        this.Initialize(s);
    }

    public FooBar(int i)
    {
        this.Initialize("My String");
    }

    private void Initialize(string s) {
        // Do what constructor 1 did
    }
}

2
为什么不将该功能封装到一些方法中,然后在构造函数(或任何其他地方)中调用它?
public class FooBar()
{
    public FooBar(string s)
    {
        LoadUser(s);
    }

    public FooBar(int i) : this("My String")
    {
        var s=CheckUser();
        LoadUser(s);
    }

    private string CheckUser()
    {
       return "the id/name from db";
    }
    private void LoadUser(string s)
    {
          //load the user
    }

}

这是一个通用解决方案。您可以根据您的具体情况更改返回类型。


2
通常情况下,您可以使用以下方法:
public class FooBar()
{
    private Test(string s)
    {
        // Some functionality
    }

    public FooBar(string s)
    {
        Test(s);
    }

    public FooBar(int i)
    {
        // Do what you need here
        Test("MyString");
    }    
}

1
最佳方法是不要把那个逻辑放在构造函数中。将其拆分成其他可以随时调用而不必担心构造器锁链的方法。

谢谢。我同意构造函数链可能会引起混淆,而且我可能无法得到我需要的东西。我决定使用其他私有方法。 - Farhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接