C# 首选哪个:Regex.Replace()或。aRegexObject.Replace()?

C# 首选哪个:Regex.Replace()或。aRegexObject.Replace()?,c#,regex,C#,Regex,这是一个后续行动 前两个答案都是正确和完整的,并且在一天结束时,产生完全相同的结果。但是,一个使用Regex对象并调用aRegex.Replace(…)方法(Joel的答案),另一个使用静态Regex.Replace(…)方法。(CMS的回答) 首选哪种方法? 在什么情况下您会改变主意?使用regex对象意味着regex只编译一次,因此您可以获得更好的性能(您需要将regex对象保存到某个地方)。使用静态实例将每次创建一个新的regex对象,因此最好自己实例化它。以下是我在System.dll上

这是一个后续行动

前两个答案都是正确和完整的,并且在一天结束时,产生完全相同的结果。但是,一个使用Regex对象并调用aRegex.Replace(…)方法(Joel的答案),另一个使用静态Regex.Replace(…)方法。(CMS的回答)

首选哪种方法?

在什么情况下您会改变主意?

使用regex对象意味着regex只编译一次,因此您可以获得更好的性能(您需要将regex对象保存到某个地方)。

使用静态实例将每次创建一个新的
regex
对象,因此最好自己实例化它。以下是我在System.dll上使用Reflector时发现的内容:

public static string Replace(string input, string pattern, string replacement)
{
    return new Regex(pattern, RegexOptions.None, true).Replace(input, replacement);
}
另外,如果您实例化自己的实例,您也将能够编译它,并提高多用途的性能


您可以将
RegexOptions.Compiled
发送到其中一个静态
Replace
重载,但这是毫无意义的,因为将使用此标志实例化的
Regex
对象不能再次使用。

它并不像看上去那样低效。使用reflector进入Regex构造函数,它缓存编译的Regex代码。这可能是最耗时的部分

我最初通常使用Regex.Replace(),因为它更方便,并且只有在出现性能问题时才进行更改

为了方便起见,您还可以在字符串上编写扩展方法,例如:

public static string RegexReplace(this string source, string pattern, string replacement)
{
    return Regex.Replace(source, pattern, replacement);
}

反射器真的很清楚。仅对真正的一次性使用static。反射器显示static方法无论如何构造一个Regex对象。与构建自己的对象相比,使用静态对象似乎没有性能优势。它只是作为一次性的速记似乎很有用。