在执行字符串替换之前是否需要这个if语句是多余的吗?
if (myString.Contains(oldValue))
{
myString = myString.Replace(oldValue, newValue);
}
有关 String.Replace 的所有详细信息均在文档中:
返回值:
返回一个字符串,该字符串与当前字符串等效,除了所有实例的 oldValue 都被替换为 newValue。 如果当前实例中未找到 oldValue,则该方法返回不经修改的当前实例。
if
语句不是必需的。
if
语句甚至不是性能优化,因为如果在当前实例中未找到 oldValue,则 String.Replace
返回相同的对象实例。我使用以下代码进行了验证:
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功能(右键单击Locals、Auto或Watch窗口中的符号;有关详细信息,请参见常用表达式求值器功能)生成了以下输出:
s | "Test" {$1}
s2 | "Test" {$1}
s3 | "Tttt" {$2}
oldValue
的情况。 StringBuilder
通过Replace
调用进行了变异。使用安全代码无法改变string
,因此必须分配一个新实例。您答案的第一部分是正确的(使用.NET 4.5.1进行测试)。如果未找到oldValue
,则对于已经过国际化和未经国际化的字符串,都将返回相同的原始实例。 - Kirill Shlenskiy由于String.Replace()
函数在字符串不包含指定值时不会抛出异常,因此验证是不必要的。这将导致多余的条件判断。
例子说明何时使用它更有优势:
在与上述相同的前提下,另一个替换器是“[[Payments]]”。这将进入数据库,并带出用户进行的前1000笔交易的日志,然后对检索到的数据进行处理并显示电子邮件正文中的详细信息。想象一下,每次用户从应用程序发送电子邮件时都必须执行所有这些操作,即使它不包含“[[Payments]]”关键字!在调用生成“[[Payments]]”字符串值的方法之前进行包含判断,在这里真的很值得!
长话短说,这取决于您的实现,但在大多数情况下-是不必要的。
查看(View) -> 其他窗口(Other Windows) -> C# 交互式(C# Interactive)
。 - pixelmike