Question

Je le code suivant:

CustomerService service;
public CustomerService Service
{
    get
    {
        if (this.service == null)
        {
            this.service = new CustomerService();
        }
        return this.service;
    }
}

public DataTable GetCustomers()
{
    return this.Service.GetCustomers();
}

Maintenant, la question est: si je l'ai écrit la méthode ci-dessus comme suit (sans « cela »), il me donne une erreur. Instance n'est pas référence à un objet

public DataTable GetCustomers()
{
    return Service.GetCustomers(); // this will spell the error "instance is not reference to an object"
}

Quelqu'un sait-il? aussi il arrive que lors de l'exécution via IIS et non à partir du serveur Web Casini (VS 2010).

Était-ce utile?

La solution

La présence ou l'absence de this ne peut pas expliquer l'erreur que vous assistez. Dans cette situation, ils veulent dire exactement la même chose et compileront au même code IL. Vérifiez l'ensemble à l'aide réflecteur .NET pour vérifier si vous le souhaitez. L'erreur se produit au hasard, probablement en raison d'une condition de course.

Une chose que je peux voir immédiatement est que si vous utilisez ce code de plusieurs threads, alors il semble que vous avez une condition de course ici:

if (this.service == null)
{
    this.service = new CustomerService();
}
return this.service;

Dans le cas multithread vous devez verrouiller sinon vous pourriez obtenir deux objets CustomerService. Je ne sais pas si cela explique votre erreur, mais il pourrait certainement créer de la confusion. Les conditions de course peuvent se produire dans un environnement, mais pas dans un autre que la fréquence de l'erreur peut dépendre du type de matériel et sur ce que les autres processus sont en cours d'exécution sur le serveur.

Vous pouvez également avoir d'autres conditions de course dans le code que vous avez pas posté . Ne pas utiliser cette technique paresseuse d'initialisation sans verrouillage, sauf si vous êtes vous que vous avez un seul fil.

Autres conseils

Vous avez probablement un conflit de nom avec un autre « Service » (classe ou espace de noms). L'utilisation de this résout.

Je suis un peu sceptique quant à la différence entre Cassinin et IIS, avez-vous vérifié avec soin que?

Quelque chose comme cela devrait être dans un singleton . Ce qui résoudrait de nombreux problèmes tels que le filetage si elles sont appliquées correctement et ferait beaucoup mieux la mise en œuvre et la lisibilité du code.

Merci -Blake Niemyjski (.netTiers membre de l'équipe)

Je tripoté un peu avec votre code dans Visual Studio et je ne pouvais pas même un conflit de nom pour produire le message d'erreur que vous avez décrit. Je ne peux pas penser à tous les cas où « this.x » peut toujours être différent de « X » sauf si « X » est un variable locale ou un paramètre méthode .

Would la derive de classe CustomerService d'une classe de base appelée Service? Si oui, alors c'est le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top