【问题标题】:Calling a constructor from another constructor in the same class从同一个类中的另一个构造函数调用构造函数
【发布时间】:2012-06-22 18:53:59
【问题描述】:

我有一个有两个构造函数的类 (C#)。这是代码sn-p:

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

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

}

是的,我知道我可以使用上述方法从另一个构造函数调用一个构造函数。但是在这种情况下,如果我调用构造函数 2,构造函数 1 中的所有语句都会在构造函数 2 中的语句执行之前运行。

我想要的是在构造函数2中的所有语句都运行之后,它会调用构造函数1。

在我的确切情况下,我正在进行用户身份验证。构造函数 1 仅使用用户 ID 检索用户信息,但构造函数 2 使用电子邮件和密码进行用户身份验证。如果用户在数据库中,它会获取用户 ID,现在我希望构造函数 1 填充类的所有属性。

如果您需要更多信息,请告诉我。如果您认为还有其他更好的方法,我很乐意听取建议。

更新 1: 我想知道为什么没有实现这样的事情:

public FooBar(bool b)
{
    // constructor 3, some more functionality
    this.FooBar("My String"); // calling constructor 1
}

【问题讨论】:

  • 有趣的场景。您可以在单独的函数中移动功能,或创建重载的构造函数FooBar(string s, int i)。可能不是最好的解决方案,只是抛出一些想法。
  • @Justin,将逻辑放在另一种方法中似乎是一个更好的主意。谢谢。

标签: c# .net oop c#-4.0 constructor


【解决方案1】:

为什么不将该功能包装到一些 method 中并在构造函数(或任何你想要的地方)中调用它?

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");
        }    
    }
    

    【讨论】:

      【解决方案3】:

      在这种情况下,不要使用构造函数调用,而是使用类似的东西:

      public class FooBar()
      {
          public FooBar(string s)
          {
              Init1();
          }
      
          public FooBar(int i)
          {
              Init2(); 
              Init1();
          }
      
      }
      

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

      实际上,您可以以更适合您需求的方式安排此函数调用。

      【讨论】:

        【解决方案4】:

        最佳方法 - 不要将该逻辑放在构造函数中。将其分解为您可以随意调用的其他方法,而无需担心构造函数链接。

        【讨论】:

        • 谢谢。我同意构造函数链接会引起混乱,而且我可能无法得到我需要的东西。我将使用其他私有方法。
        【解决方案5】:

        您可以使用其他私有方法进行初始化:

        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
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2014-03-12
          • 1970-01-01
          • 2014-08-01
          • 2011-03-24
          • 2010-12-15
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多