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).

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top