`this`和类构造函数

时间:2013-08-02 19:12:06

标签: c# .net oop

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

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

声明this(new BarInterval[] { interval })暗示了什么?

7 个答案:

答案 0 :(得分:14)

这是constructor chaining。基本上,在执行该构造函数的内容之前,您将调用另一个构造函数。

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对象包装为数组以匹配签名。可能这只是一个方便的过载,为程序员提供了一个更简单的API,他们通常只有一个BarInterval来构建跟踪器。

答案 1 :(得分:4)

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

var tracker = new BarListTracker(interval);

相当于:

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

答案 2 :(得分:2)

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

public BarListTracker(BarInterval[] intervals)

答案 3 :(得分:2)

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

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

然而,他们可以做的一件事就是改变了另一个构造函数,即使用: this调用的构造函数:

public BarListTracker(params BarInterval[] interval)

他们甚至不需要第二个构造函数。这是一个更清洁的解决方案,并在各处产生相同的结果。另一个构造函数仍然获取一个数组,如果需要,您甚至可以将数组传递给它:

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

但是,你也可以传递一个:

var tracker = new BarListTracker(barInterval);

如果你有能力这样做,我会推荐它。

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

答案 4 :(得分: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

如果您有多个构造函数接受大量参数并希望使用默认参数提供更简单的构造函数

,这非常有用

答案 5 :(得分:0)

你将有另一个构造函数,它将BarInterval数组作为参数。这基本上只是从另一个构造函数调用构造函数。另一个可能有用的链接是Call one constructor from another

答案 6 :(得分:0)

它被称为构造函数链接。public BarListTracker(BarInterval interval):this(new BarInterval [] {interval}){} 此关键字用于构造函数的设置链接,即初始化顺序 在上述情况下,您将初始化数组元素,即在初始化BarInterval值之前的间隔值。

 public class BarListTracker 
{


    public BarListTracker(BarInterval interval) : this(new BarInterval[] { interval })//Constructor II
    {
        //call after BarListTracker(BarInterval[] barIntervals)
    }

    public BarListTracker(BarInterval[] barIntervals)//Constructor I
    {
        //call first
    }
}