繁体   English   中英

我应该在 string.Replace() 之前使用 string.Contains() 吗?

[英]Should I use string.Contains() before string.Replace()?

在进行字符串替换之前不需要这个 if 语句吗?

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

所有详细信息都在String.Replace的文档中:

返回值:
一个与当前字符串等效的字符串,只是oldValue的所有实例都被替换为newValue 如果在当前实例中未找到oldValue ,则该方法返回当前实例不变。

不需要if语句。

if语句甚至不是性能优化,因为如果未找到oldValueString.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");
        }
    }
}

使用方便的Make Object ID功能(右键单击LocalsAutoWatch窗口中的符号;有关更多详细信息,请参阅Common Expression Evaluator Features )产生以下输出:

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

由于如果字符串不包含指定值, String.Replace()函数不会抛出异常,因此无需对其进行验证。 它将经历一个不必要的条件。

我知道这是一个旧线程,但只是想提供我的 2¢!

如果我说的有误,请告诉我,但我只是在我的环境中尝试过,看起来似乎有道理::)

在大多数情况下,是的,replace 函数将为您完成包含,因此没有必要单独使用它。 但是,如果您的“新值”是从方法派生的,那么这样做是有好处的——这取决于在方法中为获得该值所做的工作量!

不利时示例:我正在为应用程序发送的电子邮件正文制作“字符串替换器”。 例如,如果用户在电子邮件正文中有“[[用户名]]”,我想用收件人的名字替换它。 值得庆幸的是,我们的框架将该信息存储在内存中,因此我不介意对其进行一次替换。

有利时示例:在与上述相同的前提下,另一个替代者是“[[Payments]]”。 这将转到数据库,并显示用户进行的前 1000 笔交易的日志,然后对检索到的数据进行一些处理并在电子邮件正文中显示详细信息。 想象一下,每次用户从应用程序发送电子邮件时都必须执行所有这些操作,即使它不包含“[[Payments]]”关键字! 在调用我的方法之前拥有包含字符串值“[[Payments]]”的方法真的在这里得到回报!

长话短说,这取决于您的实施,但在大多数情况下 - 是的,这是不必要的。

根据我的经验,如果您要更换很多次(并且您需要更换一次),最好使用 Contains() 进行检查。 在我的例子中是帮助我的代码更快(几乎翻了一番)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM