6

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

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

该声明的含义是什么this(new BarInterval[] { interval })

4

6 回答 6

14

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

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。

于 2013-08-02T19:13:28.123 回答
4

这意味着调用另一个构造函数,该构造函数BarListTracker接受一个BarInterval对象数组,传入一个包含传递给此构造函数的对象的数组。它打电话

var tracker = new BarListTracker(interval);

相当于:

var tracker = new BarListTracker(new BarInterval[] { interval });
于 2013-08-02T19:13:32.680 回答
2

在此类中调用另一个构造函数,如下所示:

public BarListTracker(BarInterval[] intervals)
于 2013-08-02T19:13:50.253 回答
2

这表明当这个构造函数被调用并将值作为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(...)被调用和执行。在构建逻辑时请记住这一点。

于 2013-08-02T19:13:55.687 回答
1

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

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

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

于 2013-08-02T19:16:11.183 回答
0

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

于 2013-08-02T19:16:21.913 回答