7 Stimmen

C# Kopieren der Instanzvariable in eine lokale Variable in Funktionen derselben Klasse

Ich habe kürzlich Code in einem Open-Source-Projekt durchgesehen und viele Vorkommen dieser Art von Code gefunden:

class SomeClass
{
    private int SomeNumber = 42;

    public ReturnValue UseSomeNumber(...)
    {
        int someNumberCopy = this.SomeNumber;
        if (someNumberCopy > ...)
        {
            // ... do some work with someNumberCopy
        }
        else
        {
            // ... do something else with someNumberCopy
        }
    }
}

Gibt es einen wirklichen Nutzen darin, eine Kopie der Instanzvariable zu machen?

10voto

Alex F Punkte 40874

Möglicherweise handelt es sich hier um einen Teil eines Mehrfadenprogramms. Obwohl dieser Code nicht threadsicher ist, stellt er sicher, dass die Kopievariable einmal zugewiesen ist und von anderen Threads nicht geändert wird, und der gesamte Funktionscode nach diesem Punkt konsistent ausgeführt wird.

Ähnlicher Code mit Ereignissen wird in einer Mehrfadenumgebung kritisch:

MyEvent e = this.myEvent;

if ( e != null )
{
    e();
}

Hier ist es ohne Erstellung einer lokalen Kopie möglich, eine NULL-Pointer-Exception zu erhalten, wenn das Ereignis nach der Prüfung auf NULL und vor dem Aufruf NULL wird.

8voto

kemiller2002 Punkte 110605

Nein, es sei denn, Sie möchten den Wert von SomeNumber nicht ändern und beabsichtigen, someNumberCopy zu aktualisieren. Zum Beispiel, wenn Sie die Anzahl der Male in einer Schleife durchlaufen würden und someNumberCopy auf null abnehmen würden, um die Anzahl zu verfolgen.

Ich nehme an, das Kopieren der Variable auf diese Weise könnte Sie davor schützen, dass eine externe Funktion SomeNumber ändert und es ohne Ihr Wissen bei einer Operation ändert. Ich könnte mir vorstellen, dass dies der Fall sein könnte, wenn die Klasse in einer Mehrfadenanwendung verwendet werden soll. Vielleicht nicht der Weg, den ich gehen würde, aber das könnte die Absicht des Autors gewesen sein.

1voto

David Basarab Punkte 69965

Macht das // ... arbeite mit someNumberCopy etwas mit someNumberCopy? Wird der Wert verändert? Wird er an eine Methode übergeben, die den Wert ändern könnte?

Wenn nicht, dann nein, es gibt keinen Nutzen.

1voto

Henk Holterman Punkte 249753

Sie haben einige wichtige Details ausgelassen.
Wenn mehrere Threads auf SomeNumber zugreifen und dieses Szenario:

    int someNumberCopy = this.SomeNumber;
    if (someNumberCopy > x)
    {
        // Arbeit mit someNumberCopy durchführen
        // die auf (someNumberCopy > x) == true beruht
    }

Dann ist es wichtig, eine Kopie zu machen.

1voto

Davy8 Punkte 30108

Es könnte nützlich sein, wenn this.SomeNumber von einem anderen Thread geändert werden kann, aber für die Dauer dieser Methode ist es entscheidend, dass die someNumberCopy nicht verändert werden kann (sie kann nicht mit SomeNumber synchronisiert werden), dann könnte dies machbar sein, sonst sehe ich keinen Grund dafür.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X