2011-12-11 9 views
11

tengo el siguiente código:¿Puedo combinar los constructores en 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); 
    } 

¿Hay alguna manera de que pueda simplificar los constructores para que cada no tiene que hacer las llamadas StorageHelper?

También tengo que especificar esto. ?

Respuesta

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

} 

Esto primero llamará a su otro constructor. También puede usar base(... para llamar a un constructor base.

this en este caso es implícito.

6

sí, usted tiene un par de opciones:

1) Resumen de la lógica de iniciación común a otro método y llamar a que a partir de cada constructor. Usted tendría este método si se necesitan para controlar el orden en que se inicializan los elementos (es decir, si _modelState requiere _accountRepository que ser inicializado después de él):

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) Cascada de constructores por la adición de this al final:

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

Solo para confirmar. ¿Cuál de las palabras "este" podría eliminar? –

+0

No está del todo claro lo que está preguntando, pero si está preguntando sobre el código 'this._', puede eliminarlos todos. Por ejemplo, 'this._accountRepository' también se puede escribir como' _accountRepository'. El 'this' al que me refería está en la misma línea que la declaración del constructor (desplácese hacia la derecha para verlo). –

+1

@RichardM: Prácticamente todos. 'this' casi siempre se puede inferir dentro del contexto, a menos que esté pasando una variable con el mismo nombre. A algunas personas les gusta, citando la legibilidad (más explícita). A otros no les gusta por la misma razón (información redundante). –

Cuestiones relacionadas