ciò che renderebbe il “questo” clausola di diverso?
Domanda
Ho il seguente codice:
CustomerService service;
public CustomerService Service
{
get
{
if (this.service == null)
{
this.service = new CustomerService();
}
return this.service;
}
}
public DataTable GetCustomers()
{
return this.Service.GetCustomers();
}
Ora la domanda è: se ho scritto il metodo di cui sopra come segue (senza "questo"), mi sta dando un errore:. Istanza non è riferimento a un oggetto
public DataTable GetCustomers()
{
return Service.GetCustomers(); // this will spell the error "instance is not reference to an object"
}
Qualcuno sa? anche succede solo durante l'esecuzione tramite IIS e non dal web server Casini (VS 2010).
Soluzione
La presenza o l'assenza di this
non può spiegare l'errore che si sta assistendo. In questa situazione significano esattamente la stessa cosa e si compilare lo stesso codice IL. Verificare l'assembly utilizzando .NET Reflector per verificare questo se lo si desidera. L'errore si verifica in modo casuale, probabilmente a causa di una condizione di competizione.
Una cosa che posso subito vedere è che se si esegue questo codice da più thread, allora sembra che si dispone di una condizione di competizione qui:
if (this.service == null)
{
this.service = new CustomerService();
}
return this.service;
Nel caso multithreading si avrebbe bisogno di bloccare altrimenti si potrebbe ottenere due oggetti CustomerService. Non sono sicuro se questo spiega l'errore, ma certamente potuto creare confusione. condizioni di corsa possono verificarsi in un ambiente, ma non in un altro quando la frequenza dell'errore può dipendere dal tipo di hardware e su quali altri processi sono in esecuzione sul server.
Si può anche avere altre condizioni di gara nel codice che hai postato non . Non utilizzare questa tecnica di inizializzazione pigra senza bloccare se non si è che che si dispone di un solo thread.
Altri suggerimenti
Probabilmente avete un conflitto di nomi con un altro 'servizio' (classe o spazio dei nomi). L'uso di this
risolve.
Sono un po 'scettico circa la differenza tra Cassinin e IIS, avete controllato con attenzione che?
Qualcosa del genere dovrebbe essere in una Singleton . Quale sarebbe risolvere molti problemi come infilare se attuate correttamente e renderebbe l'attuazione e la leggibilità del codice molto meglio.
Grazie -Blake Niemyjski (.netTiers membro del team)
I giocherellava un po 'con il codice in Visual Studio e non ho potuto anche ottenere un conflitto di nomi per produrre il messaggio di errore che hai descritto. Non riesco a pensare di qualsiasi caso in cui “this.x” può mai essere diverso da “X”, tranne quando “X” è un variabile locale o metodo parametro .
Può la classe CustomerService
derivano da una classe di base denominata Service
? Se è così, allora questo è il problema.