2015-12-21 18 views
4

在進行字符串替換之前是否沒有必要擁有此if語句?我應該在string.Replace()之前使用string.Contains()嗎?

if (myString.Contains(oldValue)) 
{ 
     myString = myString.Replace(oldValue, newValue); 
} 
+5

嘗試沒有找出。 – adv12

+1

最新的Visual Studio有一個交互式的C#提示,非常適合實驗:'查看 - >其他窗口 - > C#Interactive' – pixelmike

+0

要加入@ adv12的觀點,您在嘗試時發現了什麼,這個?或者如果你沒有自己嘗試過,那是什麼阻止了你這樣做。 –

回答

9

所有的細節都在文檔中爲String.Replace

返回值:
一個字符串,它相當於除了屬性oldValue的所有實例與NEWVALUE替換當前字符串。 如果在當前實例中找不到oldValue,則該方法返回當前實例不變。

if聲明不是必需的。

if說法甚至不是一個性能優化,因爲String.Replace返回同一個對象實例,如果屬性oldValue是找不到的。我已經驗證了這一點使用下面的代碼:

namespace StringReplaceTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string s = "Test"; 
      string s2 = s.Replace("Foo", "Bar"); 
      string s3 = s.Replace("es", "tt"); 
     } 
    } 
} 

使用得心應手使對象ID功能(在一個符號在當地人自動,或觀看窗口中右鍵單擊,看到Common Expression Evaluator Features有關詳細信息)產生了以下的輸出:

s | "Test" {$1} 
s2 | "Test" {$1} 
s3 | "Tttt" {$2} 
+0

引用的ReferenceSource註釋僅適用於找到'oldValue'的情況。 'StringBuilder'由'Replace'調用突變。 'string'不能使用安全代碼進行變異,所以必須分配一個新的實例。答案的第一部分是正確的(使用.NET 4.5.1進行測試)。如果未找到'oldValue',則將爲interned字符串和非interned字符串返回相同的原始實例。 –

+0

@KirillShlenskiy:看似不同意的信息引起了我的好奇心。我檢查了這一行爲,並得出了您在評論中發佈的相同結論。 – IInspectable

+0

這是一個很好的答案。我要求OP接受這個答案,而不是我的。 *真的*,我的只是兩三行。這是一個更詳細的答案。 –

3

由於String.Replace()功能沒有拋出一個異常,如果字符串不包含指定的值,這是不必要的,以驗證它。它會經歷一個不必要的條件。

相關問題