使用正则表达式和干净的字符串内存?

时间:2016-08-05 13:54:13

标签: c# regex

我在regex中有一个简单的代码:

string strFile5 = File.ReadAllText(@"C:\Users\dennis\Desktop\regex.txt"); 

strFile5 = Regex.Replace(strFile5, @"Documents", "document2");
File.WriteAllText(@"C:\Users\dennis\Desktop\regex2.txt", strFile5);

我想从内存中删除strFile5。

2 个答案:

答案 0 :(得分:6)

您不必担心变量strFile5,一旦超出范围,它将被垃圾收集器收集。你无需做任何事情。

此外,没有必要使用Rgex.Replace一个简单的string.Replace来完成这项工作。

您也可以在一个语句中完成所有操作,而不涉及任何变量,如:

File.WriteAllText(@"C:\Users\dennis\Desktop\regex2.txt",
                   File.ReadAllText(@"C:\Users\dennis\Desktop\regex.txt")
                        .Replace("Documents", "document2"));

答案 1 :(得分:5)

当GC不再使用时,GC会标记要收集的局部变量。所以你不必担心自己。

阅读:Should I Set Variables to Null to Assist Garbage Collection

Jeffrey Richter在CLR中的例子来自C#:

public static void Main() 
{  
    Timer t = new Timer(TimerCallback, null, 0, 2000);           
    Console.ReadLine();     
}
  

当集合开始时,它首先假定集合中的所有对象   堆是不可达的(垃圾);这包括Timer对象。然后,   收集器检查应用程序的根,并看到Main   在初始分配后不使用t变量。   因此,应用程序没有涉及Timer的变量   对象,垃圾收集为它回收内存;这个   停止计时器并解释调用TimerCallback方法的原因   只有一次。

     

假设您正在使用调试器逐步执行Main,并且a   垃圾收集恰好发生在t被分配之后   新Timer对象的地址。然后,假设你试图查看   使用调试器的Quick Watch引用的对象   窗口。你认为会发生什么? 调试器无法显示   对象,因为它只是垃圾收集。这种行为会   被大多数开发人员认为是非常意外和不受欢迎的   微软已经提出了一个解决方案。

     

使用C#编译器的/ debug开关编译程序集时,   编译器应用System.Diagnostics.DebuggableAttribute及其   DebuggingModes的DisableOptimizations标志设置为结果   部件。在运行时,编译方法时,JIT编译器会看到   这个标志设置,并人为地延长所有根的生命周期   方法的结尾。对于我的例子, JIT编译器欺骗自己   相信Main中的t变量必须存活到结尾   方法。因此,如果垃圾收集发生,垃圾   收集器现在认为t仍然是一个根和那个Timer对象   t指的将继续可达。 Timer对象会   在集合中存活,TimerCallback方法将被调用   反复进行,直到Console.ReadLine返回并且Main退出。