2011-12-11 19 views
11

ho il seguente codice:Posso combinare i costruttori in C#

public AccountService(ModelStateDictionary modelStateDictionary, string dataSourceID) 
    { 
     this._modelState = modelStateDictionary; 
     this._accountRepository = StorageHelper.GetTable<Account>(dataSourceID); 
     this._productRepository = StorageHelper.GetTable<Product>(dataSourceID); 
    } 

    public AccountService(string dataSourceID) 
    { 
     this._accountRepository = StorageHelper.GetTable<Account>(dataSourceID); 
     this._productRepository = StorageHelper.GetTable<Product>(dataSourceID); 
    } 

C'è qualche modo che io possa semplificare le costruttori in modo che ogni non hanno a che fare le chiamate StorageHelper?

Inoltre, è necessario specificarlo. ?

risposta

22
public AccountService(ModelStateDictionary modelStateDictionary, string dataSourceID) 
    : this(dataSourceID) 
{ 
    this._modelState = modelStateDictionary; 

} 

Questo sarà prima chiamare la tua altro costruttore. È anche possibile utilizzare base(... per chiamare un costruttore di base.

this in questo caso è implicito.

6

Sì, avete un paio di scelte:

1) Abstract la logica di inizializzazione comune in un altro metodo e chiamare che da ogni costruttore. Si avrebbe bisogno di questo metodo se si ha bisogno per controllare l'ordine in cui vengono inizializzati articoli (cioè se _modelState richiede _accountRepository essere inizializzato dopo):

public AccountService(ModelStateDictionary modelStateDictionary, string dataSourceID) 
{ 
    this._modelState = modelStateDictionary; 
    Initialize(dataSourceID); 
} 

public AccountService(string dataSourceID) 
{ 
    Initialize(dataSourceID); 
} 

private void Initialize(string dataSourceID) 
{ 
    this._accountRepository = StorageHelper.GetTable<Account>(dataSourceID); 
    this._productRepository = StorageHelper.GetTable<Product>(dataSourceID); 
} 

2) Cascade costruttori aggiungendo this alla fine:

public AccountService(ModelStateDictionary modelStateDictionary, string dataSourceID) : this(dataSourceID) 
{ 
    this._modelState = modelStateDictionary; 
} 

public AccountService(string dataSourceID) 
{ 
    this._accountRepository = StorageHelper.GetTable<Account>(dataSourceID); 
    this._productRepository = StorageHelper.GetTable<Product>(dataSourceID); 
} 
+0

Giusto per confermare. Quale delle "queste" parole se qualcuno potrei rimuovere? –

+0

Non completamente chiaro quello che stai chiedendo, ma se stai chiedendo del codice 'this._', puoi rimuoverli tutti. Ad esempio, 'this._accountRepository' può anche essere scritto come' _accountRepository'. Il "questo" a cui mi riferivo si trova sulla stessa riga della dichiarazione del costruttore (scorrere a destra per vederlo). –

+1

@RichardM: Praticamente tutti loro. "questo" può quasi sempre essere dedotto nel contesto, a meno che tu non stia passando una variabile con lo stesso nome. A qualcuno piace, citando la leggibilità (più esplicita). Altri lo detestano per lo stesso motivo (informazioni ridondanti). –