在代码中使用this()

时间:2012-02-26 12:59:41

标签: c#

我是CSharp的新手。我在某些代码中看过“this()”。我的问题是假如我打电话

Paremeterized构造函数,我是否强行调用paremeterless构造函数?。但是根据构造函数构造,我相信无参数构造函数将首先被执行。您能用简单的示例解释这个,这样我才能准确地知道何时应该调用“this ()“。提前致谢。

 public OrderHeader() { }

 public OrderHeader(string Number, DateTime OrderDate, int ItemQty)
            : this()
        {

          // Initialization goes here ....
        }

4 个答案:

答案 0 :(得分:6)

好吧,如果你想调用无参数构造函数,你应该使用this(),就像那样简单。

例如,如果你有两个构造函数,其中无参数初始化Id并且参数完全初始化Name,你应该使用this,这样你就不会重复:

public Foo()
{
    Id = ComputeId();
}

public Foo(string name)
    : this()
{
    Name = name;
}

另一方面,如果paramterfull构造函数是初始化Id的另一种方法,则不必调用this()

public Foo()
{
    Id = ComputeId();
}

public Foo(int id)
{
    Id = id;
}

此语法也不限于无参数构造函数,您可以以相同的方式调用任何其他构造函数:

public Foo(int id, string name)
    : this(id)
{
    Name = name;
}

答案 1 :(得分:6)

默认情况下(对于类),有一个隐式:base(),所以它总是链接某些东西。添加:this()调用当前类型的无参数构造函数,依此类推 - 迟早会调用某种基本构造函数。是的,:this(...)或:base(...)在构造函数体之前发生

在显示的示例中,添加:this()没有任何危害,但也没有任何用处。在更复杂的场景中,:this(...)通常用于避免重复构造函数代码 - 通常将所有构造函数指向最参数化的版本 - 例如:

public Foo() : this(27, "abc") {} // default values
public Foo(int x, string y) {...validation, assignment, etc...}

答案 2 :(得分:1)

默认情况下,不会首先执行无参数构造函数 - 编译器将仅使用您明确调用的构造函数。如果由于某种原因需要调用无参数构造函数,请使用this()

如果删除this(),则可以在下面的示例中看到差异。

class Test
{
    public int x;
    public int y;

    public Test()
    {
        x = 1;
    }

    public Test(int y) : this() // remove this() and x will stay 0
    {
        this.y = y;
    }


class Program
{
    static void Main(string[] args)
    {
        var t = new Test(5);
        Console.WriteLine("x={0} y={1}", t.x, t.y);
    }
}

正如另一个答案中所提到的 - 调用无参数构造函数的规则首先应用于base()关键字。如果您未提供要调用的基础构造函数,则编译器将尝试调用无参数构造函数。

答案 3 :(得分:0)

构造函数链接!

要记住的重要部分是调用链的顺序。

public OrderHeader() { //Executed First
    _number = "";
    _orderDate = DateTime.Now();
}

public OrderHeader(string Number)
            : this()
        {
          _number = Number;
        }

public OrderHeader(string Number, DateTime OrderDate, int ItemQty)
            : this(Number)
        {

           _orderDate = OrderDate;
           _itemQty = ItemQty;
        }