我在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。
答案 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退出。