2014-11-13 15 views
6

Ich habe eine Methode wie:Reentrante Code und lokale Variablen

private static string AmpRemove(string str) 
{ 
    int index = str.IndexOf('&'); 
    if (index > 0) 
     str = str.Substring(0, index); 
    return str; 
} 

Hier Ich versuche, Text aus einer Zeichenfolge zu erhalten, bis & Zeichen gefunden wird. Mein Senior geändert, um dieses Verfahren zu

private static string AmpRemove(string str) 
{ 
    if (str.IndexOf('&') > 0) 
     str = str.Substring(0, str.IndexOf('&')); 
    return str; 
} 

Anstatt also die index zu speichern, wird es zweimal berechnen, und seine Begründung war, dass da das Verfahren in mehreren Threads aufgerufen werden würde, da ungültiger Wert in index gespeichert sein könnte.

Mein Verständnis von Thread ist begrenzt, aber ich glaube, dass jeder Thread einen eigenen Stapel haben würde, wo die Parameter str und index würden geschoben werden. Ich habe versucht, mit ihm zu argumentieren, dass dies ein reentranter Code ist und es keine Möglichkeit gibt, dass mehrere Threads eine lokale Variable in dieser Methode modifizieren könnten.

Also, meine Frage ist, bin ich recht in der Annahme, dass Caching index Speichern eine bessere Lösung ist, da es sich nicht zweimal Berechnung Index beinhalten wird und da es lokale Variable ist und str ist ein Parameter zur Methode lokal, dort ist keine Möglichkeit, dass mehrere Threads str und index ändern/ändern könnten?

Ist das korrekt?

+5

Ja, Sie haben Recht. caching 'index' ist jedoch die falsche Formulierung. 'index' ist nur eine lokale Variable für die Methode, unabhängig davon, ob Sie sie in einer Thread-Umgebung verwenden oder nicht. – thumbmunkeys

+0

ja, nicht sicher, wie ich dafür eine gute antwort geben kann, aber ja, du hast recht ... – CularBytes

+5

Ja, dein Senior sollte Urlaub machen. – Neolisk

Antwort

8

index kann nicht mit dem Code geändert werden, da es sich um eine lokale Variable handelt und jede aus einem anderen Thread aufgerufene Methode ein separater Aufruf ist und daher keine lokalen Variablen verwendet.

Sie haben jedoch keine Kontrolle über den Parameter string, da dieser übergeben wird. Dies würde es Thread unsicher machen ... Mit Ausnahme von MSDN, ein string Objekt ist unveränderlich. Sie können also davon ausgehen, dass die von Ihnen übergebene string die gleiche bleibt und Thread-sicher ist. Obwohl Sie den Wert str neu zuzuweisen, wurde der Parameter nicht als ref und deshalb bestanden, dass nur die lokale Zeiger neu zuweist, hat es nicht des Anrufers Variable ändern, die übergeben wurde.

Thusly, den ersten Code, wie präsentiert, ist fadensicher. Änderungen an dem übergebenen Typ oder dessen Übergabe können nicht sofort als Thread-sicher angenommen werden.

+0

Danke für die Antwort, +1, um zu erklären, dass, da Strings unveränderlich sind, dies threadsicher ist. – CriketerOnSO

2

Ihre ursprüngliche Methode ist threadsafe. Aber:

  1. Neuzuweisung Methode Variablen kann verwirrend sein, könnten Sie einfach den Substring zurück: private static string AmpRemove(string str) { var index = str.IndexOf('&'); if (index > 0) { return str.Substring(0, index); } return str; }

  2. Wenn die '&' bei Index 0 Ihr Code wird die gesamte Zeichenfolge zurück. Soll das passieren, oder sollte es index> = 0 sein?

+2

Danke, aber ja, wenn das '&' Index 0 ist, dann brauchen wir die ganze Zeichenfolge. – CriketerOnSO