【问题标题】:How to call constructor inside the class?如何在类中调用构造函数?
【发布时间】:2012-01-04 16:25:15
【问题描述】:

我想在类中调用构造函数,例如: 公共类 Myclass(){

   public MyClass(){
      //......
   }

   public MyClass(int id):this(){
      //......
   }

   private void Reset(){
      //.....
      this = new MyClass(id);    //here I want to call constructor
      //......
   }
}

但它不起作用。有可能吗?如果可以,我该怎么做?

【问题讨论】:

  • 您为什么要这样做?您不能在实例方法中以这种方式更改 this 指针,也不应该这样做。

标签: c#


【解决方案1】:

简单的回答:你不能。

稍微复杂一点的答案:将您的初始化逻辑移动到一个单独的方法中,该方法可以从构造函数和您的 Reset() 方法中调用:

public class MyClass
{
    public int? Id { get; }

    public MyClass()
    {
        Initialize();
    }

    public MyClass(int id)
    {
        Initialize(id);
    }

    public Reset()
    {
        Initialize();
    }

    private Initialize(int? id = null)
    {
        // initialize values here instead of the constructor
        Id = id;
    }
}

【讨论】:

  • 这非常简洁明了,极大地帮助了我自己的理解。
【解决方案2】:

你不能。但是您可以做的是将构造函数逻辑拆分为一个 Initialize 方法,然后 reset 可以调用该方法。

   public MyClass(){
   //......
   }

   public MyClass(int id):this(){
      Initialize(id);
   }

   private void Initialize(int id){
   //....
   }

   private void Reset(){
      //.....
      Initialize(id);
      //......
   }
}

【讨论】:

    【解决方案3】:

    不,这是不可能的。你不能分配给这个。

    但是,您可以让 Reset() 返回 MyClass 的新实例,以便调用者代码可以说:

    public class MyClass
    {
        public MyClass Reset()
        {
            return new MyClass();
        }
    }
    
    MyClass c = new MyClass();
    c = c.Reset();
    

    或者您可以实现Reset 方法,将所有字段重新初始化为其默认值。

    【讨论】:

    • 我喜欢 Reset() 返回一个新实例的想法,在这种情况下可能应该是 static
    • 如果返回了一个新实例,它就不再重置任何东西。它返回一个新创建的类实例。有点误导。
    • 没错,也许Create() 会是一个更好的方法名。
    • @JamesMichaelHare - 除非你正在创建一个对象工厂,否则你真的应该只使用 new ......这使得这个建议有点多余。
    【解决方案4】:

    可以在您的类中为您的类调用构造函数(实际上这通常使用工厂方法完成):

    public class MyClass
    {
        public static MyClass Create()
        {
            return new MyClass();   
        }
    }
    

    但是您不能更改类中this 引用的值。相反,您应该让“Reset()”方法将字段设置回它们的默认值。

    【讨论】:

      【解决方案5】:

      在一个类中,你不能重新分配this(尽管值得注意的是,在一个结构中它是完全合法的)。不过,问题是您是否应该。我假设您的目标是将所有字段值设置为特定状态,因此正如其他人已经说过的那样,您可以让您的 Reset 方法返回一个新实例,或者您可以将您的逻辑分解为 Clear() 方法并调用它而是。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 2019-03-14
        • 2018-03-31
        • 2021-03-14
        相关资源
        最近更新 更多