2012-02-26 17 views
5

Sono nuovo di CSharp.I ho visto "questo()" in qualche domanda code.My si supponga che se chiamoUsando questo() nel codice

Paremeterized costruttore, sono io che invocare il costruttore paremeterless forza ?. Ma secondo la costruzione del costruttore, credo che il costruttore non parametrico verrà eseguito per primo. Puoi spiegarlo con un semplice esempio in modo da poter ottenere esattamente quando dovrei chiamare "questo()". Grazie in anticipo.

public OrderHeader() { } 

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

      // Initialization goes here .... 
     } 

risposta

6

Per impostazione predefinita (per le classi), v'è un implicito: di base(), quindi è sempre incatena qualcosa. Aggiungendo: this() chiama il costruttore senza parametri del tipo corrente, e così via - prima o poi chiamerà un costruttore di base di qualche tipo. Sì, il: questo (...) o: base (...) succede prima del il corpo del costruttore.

Nell'esempio mostrato, aggiungendo: this() non fa male, ma non fa nulla di utile neanche. Negli scenari più complessi,: questo (...) è comunemente usato per evitare la duplicazione di codice del costruttore - di solito dirigere tutti i costruttori alla versione più parametrizzato - ad esempio:

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

Grazie mille. – user1233805

+0

Più parametrizzato, intendevi? – GSerg

+0

@GSerg si, dannato ipad –

6

Beh, si dovrebbe usare this() se si desidera chiamare il costruttore senza parametri, è così semplice come sembra.

Ad esempio, se si dispone di due costruttori, dove la senza parametri inizializza Id e la parameterfull inizializza anche Name, si dovrebbe usare this, in modo da non ripetere se stessi:

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

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

D'altra parte , se il costruttore paramterfull è un modo diverso per inizializzare il Id, non c'è bisogno di chiamare this():

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

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

Questa sintassi è als o non solo, il costruttore senza parametri, è possibile chiamare qualsiasi altro costruttore stesso modo:

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

senza parametri costruttore non sarà eseguita prima di default - Il compilatore utilizzerà solo il costruttore che stai invocando esplicitamente. Se è necessario richiamare il costruttore senza parametri per qualche motivo, utilizzare this().

È possibile visualizzare la differenza nell'esempio riportato di seguito se si rimuove 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); 
    } 
} 

come è stato detto in un'altra risposta - la regola per invocare il costruttore senza parametri prima si applica alla parola base(). Se non si fornisce il costruttore di base da richiamare, il compilatore tenterà di richiamare quello senza parametri.

0

Catena di montaggio!

La parte importante da ricordare è l'ordine in cui viene chiamata la catena.

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