2014-11-13 22 views
6

我有這樣的方法:重入代碼和局部變量

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

在這裏,我想直到&字符是從字符串中獲取文本。我的高級修改這個方法來

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

因此,而不是存儲index的,它會計算了兩遍,他的理由是,因爲該方法將在多個線程調用,有可能是存儲在index無效值。

我對線程的理解是有限的,但我相信每個線程都有自己的棧,其中參數strindex將被推送。我已經嘗試過與他合作,這是一個可重入的代碼,並且多線程無法在此方法中修改局部變量。

所以,我的問題是,我是正確的假設, 緩存 存儲index是一個更好的解決方案,因爲它不涉及兩次計算指數,因爲它是局部變量,str是一個參數本地方法,是不是多線程可以修改/更改strindex

這是正確的嗎?

+5

是的你是對的。緩存'索引'雖然是錯誤的措辭。如果您在線程環境中使用索引,「index」只是該方法的局部變量。 – thumbmunkeys

+0

是的,不知道我怎麼能爲此做出一個好的答案,但是,是的,你是對的... – CularBytes

+5

是的,你的老人應該得到一個假期。 – Neolisk

回答

8

index不能修改給定的代碼,因爲它是一個局部變量,而從另一個線程調用的任何方法是一個單獨的調用,因此不共享局部變量。

但是,您不控制參數string,因爲它會傳入。這會使其線程不安全...除MSDN外,string對象是不可變的。因此,您可以假定您通過的string在呼叫之間保持不變,並且是線程安全的。雖然重新分配的str值,參數不作爲ref傳遞,因此,只有重新分配的局部指針,它修改這是在通過調用者的變量。

正是如此,第一個代碼,呈現,是線程安全的。對傳入的類型或傳入方式的任何更改都不能立即假定爲線程安全的。

+0

感謝您的答案+1,因爲解釋說因爲字符串是不可變的,所以這是線程安全的。 – CriketerOnSO

2

您的原始方法是線程安全的。但是:

  1. 重新分配方法變量可能會造成混淆,你可以只返回字符串: private static string AmpRemove(string str) { var index = str.IndexOf('&'); if (index > 0) { return str.Substring(0, index); } return str; }

  2. 如果「&」的索引爲0的代碼將返回整個字符串。這是應該發生的,還是應該是index> = 0?

+2

謝謝,但是,如果'&'是索引0,那麼我們需要整個字符串。 – CriketerOnSO