2014-11-13 20 views
6

Ho un metodo simile:codice rientrante e le variabili locali

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

Qui sto cercando di ottenere il testo da una stringa finché non si trova & carattere. Il mio anziano modificato questo metodo per

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

Così, invece di memorizzare il index, calcolerà due volte, e il suo ragionamento era che, dal momento che il metodo potrebbe essere rimessa in più thread, ci potrebbe essere un valore non valido memorizzato in index.

La mia comprensione del thread è limitata, ma credo che ogni thread avrebbe il proprio stack, in cui il parametro str e index verrà inserito. Ho provato a ragionare con lui, che questo è un codice di rientro e non c'è modo che più thread possano modificare una variabile locale in questo metodo.

Quindi, la mia domanda è, io ho ragione nel ritenere che caching memorizzazione index è una soluzione migliore, dal momento che non comporterà il calcolo dell'indice due volte e dato che è variabile locale e str è un parametro locale per il metodo, ci non è possibile che più thread possano modificare/modificare str e index?

È corretto?

+5

sì hai ragione. 'caching 'index' è la dicitura sbagliata. 'index' è solo una variabile locale del metodo, indipendentemente se lo si utilizza in un ambiente con thread o meno. – thumbmunkeys

+0

sì, non sono sicuro di come posso dare una buona risposta, ma sì, hai ragione ... – CularBytes

+5

Sì, il tuo senior dovrebbe fare una vacanza. – Neolisk

risposta

8

index non modificabili dato il codice, perché è una variabile locale e ogni metodo chiamato da un altro thread è una chiamata separata e quindi non condivide variabili locali.

Tuttavia, non si controlla il parametro string dal momento che viene passato in. Ciò renderebbe filo pericoloso ... Tranne secondo le MSDN, un oggetto string è immutabile. Si può quindi presumere che lo string che si ottiene rimanga lo stesso tra le chiamate e sia sicuro per i thread. Anche se si riassegna il valore della str, il parametro non è stato passato come ref e, pertanto, che solo riassegna il puntatore locale, lo fa non modificare variabile del chiamante che è stata approvata in.

Questa convenzione, il primo codice, come presentato, è thread-safe. Qualsiasi modifica al tipo in cui è stato inoltrato o in che modo è stata inoltrata non può essere immediatamente considerata sicura per i thread.

+0

Grazie per la risposta, +1, per spiegare che, poiché le stringhe sono immutabili, questo è sicuro. – CriketerOnSO

2

Il metodo originale è protetto da thread. Ma:

  1. Riassegnazione variabili metodo può essere fonte di confusione, si può solo restituire il Substring: private static string AmpRemove(string str) { var index = str.IndexOf('&'); if (index > 0) { return str.Substring(0, index); } return str; }

  2. Se il '&' è indice 0 il codice restituirà l'intera stringa. È questo che dovrebbe accadere o dovrebbe essere indice> = 0?

+2

Grazie, ma sì, se '&' è indice 0, allora abbiamo bisogno dell'intera stringa. – CriketerOnSO