2012-02-26 55 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; 
     }