在进行字符串替换之前是否没有必要拥有此if语句?我应该在string.Replace()之前使用string.Contains()吗?
if (myString.Contains(oldValue))
{
myString = myString.Replace(oldValue, newValue);
}
在进行字符串替换之前是否没有必要拥有此if语句?我应该在string.Replace()之前使用string.Contains()吗?
if (myString.Contains(oldValue))
{
myString = myString.Replace(oldValue, newValue);
}
所有的细节都在文档中为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}
引用的ReferenceSource注释仅适用于找到'oldValue'的情况。 'StringBuilder'由'Replace'调用突变。 'string'不能使用安全代码进行变异,所以必须分配一个新的实例。答案的第一部分是正确的(使用.NET 4.5.1进行测试)。如果未找到'oldValue',则将为interned字符串和非interned字符串返回相同的原始实例。 –
@KirillShlenskiy:看似不同意的信息引起了我的好奇心。我检查了这一行为,并得出了您在评论中发布的相同结论。 – IInspectable
这是一个很好的答案。我要求OP接受这个答案,而不是我的。 *真的*,我的只是两三行。这是一个更详细的答案。 –
由于String.Replace()
功能没有抛出一个异常,如果字符串不包含指定的值,这是不必要的,以验证它。它会经历一个不必要的条件。
尝试没有找出。 – adv12
最新的Visual Studio有一个交互式的C#提示,非常适合实验:'查看 - >其他窗口 - > C#Interactive' – pixelmike
要加入@ adv12的观点,您在尝试时发现了什么,这个?或者如果你没有自己尝试过,那是什么阻止了你这样做。 –