`this和类构造函数

本文关键字:构造函数 this | 更新日期: 2023-09-27 18:26:13

我现在有一个类,我对它的构造函数有点困惑。

 public class BarListTracker : GotTickIndicator
 {
    public BarListTracker(BarInterval interval) : this(new BarInterval[] { interval }) { }
 }

声明this(new BarInterval[] { interval })意味着什么?

`this和类构造函数

这是构造函数链接。从本质上讲,在执行一个不同的构造函数的内容之前,您将调用该构造函数。

public class Foo
{
    public Foo()
        : this("Hello")
    {
        Console.Write(" World!");
    }
    public Foo(string text)
    {
        Console.Write(text);
    }
}
new Foo(); //outputs "Hello World!"

因此,在BarListTracker的某个地方,应该有另一个构造函数,它采用BarInterval[]数组或类似的IEnumerable<BarInterval>

public class BarListTracker : GotTickIndicator
{
    public BarListTracker(BarInterval interval) 
        : this(new BarInterval[] { interval }) 
    { 
        //specific initialization for this constructor
    }
    public BarListTracker(BarInterval[] intervals) 
    { 
        //shared initialization logic for both constructors
    }
}

它将执行主体BarListTracker(BarInterval[])然后执行BarListTracker(BarInterval) 的主体

这通常用于减少代码重复。如果您有一些BarListTracker的初始化代码,那么在一个地方编写它并与构造函数共享该逻辑比为每个构造函数重写它更有意义。

此外,它还允许您通过基本表达式传入或修改输入参数。因此,在这种情况下,在调用BarListTracker(BarInterval[])构造函数的同时,它将单个BarInterval interval对象包装为一个数组,以匹配签名。这可能只是一个方便的重载,为那些通常只有一个BarInterval来构建跟踪器的程序员提供一个更简单的API。

这意味着对BarListTracker的另一个构造函数的调用,该构造函数接受BarInterval对象的数组,传入一个包含传递到此构造函数中的对象的数组。它使呼叫

var tracker = new BarListTracker(interval);

相当于:

var tracker = new BarListTracker(new BarInterval[] { interval });

这表示当调用类中的另一个构造函数并将该值作为BarInterval的数组传递时,它们正在类中基于或调用该构造函数。在这种情况下,它不是基类,因为否则它会说: base(...),它是在这个类中定义的另一个构造函数。

这是非常常见的,因为您希望以多种不同的方式访问一个类,在这种情况下,他们似乎希望有时只发送一个对象,而不在代码中设置数组。

然而,他们本可以做的一件事就是更改另一个构造函数,用: this调用的构造函数如下:

public BarListTracker(params BarInterval[] interval)

他们甚至不需要第二个构造函数。这是一个更清洁的解决方案,在任何地方都能产生相同的结果。另一个构造函数仍然得到一个数组,如果你愿意,你甚至可以向它传递一个数组:

var arrOfBarInterval = new BarInterval[] { val1, val2 };
var tracker = new BarListTracker(arrOfBarInterval);

但是,你也可以通过一个:

var tracker = new BarListTracker(barInterval);

如果你有能力做到这一点,我会推荐它。

需要注意的一点是,: this(...)构造函数在您所在的构造函数之前被调用和执行。在构建逻辑时请记住这一点。

调用该类中的另一个构造函数,类似于以下内容:

public BarListTracker(BarInterval[] intervals)

它调用同一类的另一个构造函数,例如

public class Point{
    public Point(int x, int y){
      this.x=x;
      this.y=y;
    }
    public Point():this(0,0){}
}

如果在你的代码中你调用

var p= new Point();

您将使用定义的无参数构造函数,该构造函数将调用参数传递给他的构造函数0,0

如果您有多个接受大量参数的构造函数,并且希望提供具有默认参数的更简单的构造函数,那么这是非常有用的

您将拥有另一个以BarInterval数组为参数的构造函数。这基本上只是从另一个构造函数调用一个构造函数。另一个可能有用的链接是从另一个调用一个构造函数