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

时间:2015-12-21 20:47:01

标签: c# .net

在进行字符串替换之前是否没有必要使用这个if语句?

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

4 个答案:

答案 0 :(得分:11)

所有详细信息都在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 功能(右键单击本地中的符号,自动观看< / em> window;有关详细信息,请参阅Common Expression Evaluator Features),产生以下输出:

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

请让我知道我在说什么是错的,但是我只是在我的环境中尝试过,似乎很合理! :)

在大多数情况下,是的,replace函数将为您完成包含,因此无需单独包含它。但是,如果您的“新值”是从某个方法派生的,这样做是有好处的-取决于要完成多少工作才能在该方法中获得该值!

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

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

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

答案 3 :(得分:-1)

以我的经验,如果您要替换很多时间(并且需要一次替换),则可以使用Contains()更好地进行检查。就我而言,是帮助我的代码更快(几乎翻了一番)。