2012-02-26 73 views
5

我是新来CSharp.I看到“这个()”在一些code.My问题是,如果我叫使用这个()中代码

Paremeterized构造假设,我是调用paremeterless构造有力?但是根据构造函数的构造,我相信无参数的构造函数会首先被执行。请你用简单的例子来解释一下,这样我就可以确切地知道什么时候应该调用“this()”。

public OrderHeader() { } 

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

      // Initialization goes here .... 
     } 

回答

6

默认情况下(上课),有一个隐含的:基地(),所以它总是链接东西。添加:this()调用当前类型的无参数构造函数,等等 - 迟早会调用某种基类构造函数。是的,这个(...)或者:base(...)发生在之前的构造函数体。

在显示的示例中,添加:this()没有任何危害,但也没有任何用处。在更复杂的情况,:这个(...)常用来避免重复构造函数代码 - 通常指挥所有构造函数的参数最多的版本 - 例如:

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

非常感谢。 – user1233805 2012-02-26 13:13:21

+0

大部分参数化,你的意思是? – GSerg 2012-02-26 13:14:42

+0

@GSerg是的,该死的ipad – 2012-02-26 13:17:07

6

那么,你应该使用this()如果你想调用参数的构造函数,它就是这么简单。

举例来说,如果你有两个构造函数,其中参数的初始化Id和parameterfull还初始化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

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

如果您删除this(),您可以在下面的示例中看到不同之处。调用参数的构造函数首先适用于base()关键字的规则 -

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); 
    } 
} 

正如在其他答复中提到。如果您不提供要调用的基础构造函数,那么编译器将尝试调用无参数的构造函数。

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; 
     }