Frage

Ich habe den folgenden Code:

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

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

Nun ist die Frage: Wenn ich das obige Verfahren wie folgt (ohne „this“) schrieb, es gibt mir eine Fehlermeldung:. Instanz ist nicht Verweis auf ein Objekt

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

Wer weiß? es geschieht nur, auch während über IIS ausgeführt wird und nicht von casini Web-Server (VS 2010).

War es hilfreich?

Lösung

Das Vorhandensein oder Fehlen von this kann den Fehler nicht erklären Sie erleben. In dieser Situation bedeuten, dass sie genau das Gleiche und werden auf den gleichen IL-Code kompilieren. Überprüfen Sie die Montage .NET Reflector verwenden, dies zu überprüfen, ob Sie möchten. Der Fehler wird nach dem Zufallsprinzip auftritt, wahrscheinlich aufgrund einer Race-Bedingung.

Eine Sache, ich kann sofort sehen, ist, dass, wenn Sie diesen Code von mehreren Threads ausgeführt werden dann sieht es aus wie Sie eine Race-Bedingung hier haben:

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

Im multithreaded Fall müssen Sie sonst sperren Sie zwei Objekte Customer bekommen können. Ich bin mir nicht sicher, ob dies Ihren Fehler erklärt, aber es könnte durchaus Verwirrung stiften. Rennbedingungen können in einer Umgebung auftreten, aber nicht in einem anderen, wenn die Frequenz des Fehlers kann von der Art der Hardware abhängig ist und auf welcher anderen Prozessen werden auf dem Server ausgeführt wird.

Sie können auch andere Rennbedingungen im Code haben Sie noch nicht geschrieben . Verpassen Sie nicht diese faul Initialisierungstechnik verwenden, ohne Verriegelung, es sei denn Sie sind sicher , dass Sie nur ein Thread haben.

Andere Tipps

Sie haben wahrscheinlich einen Namenskonflikt mit einer anderen ‚Service‘ (Klasse oder Namespace). Die Verwendung von this löst es.

Ich bin ein wenig skeptisch, was den Unterschied zwischen Cassinin und IIS, müssen Sie sorgfältig, dass überprüft?

So etwas sollte in einem Singletons . Welche richtig, wenn implementiert viele Probleme wie Einfädeln lösen würde und die Umsetzung und die Lesbarkeit des Codes viel besser machen.

Danke -Blake Niemyjski (.netTiers Teammitglied)

fummelte ich ein wenig mit Ihrem Code in Visual Studio und ich konnte nicht einmal einen Namenskonflikt erhalten die Fehlermeldung zu erzeugen, die Sie beschrieben. Ich kann nicht von jedem Fall denken, in denen „this.x“ immer verschieden von „X“ sein kann, außer wenn „X“ ist ein lokale Variable oder ein Methodenparameter .

Würde der CustomerService-Klasse abgeleitet von einer Basisklasse namens Service? Wenn ja, dann, das ist das Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top