2015-12-21 61 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()功能没有抛出一个异常,如果字符串不包含指定的值,这是不必要的,以验证它。它会经历一个不必要的条件。

相关问题