我在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);
Run Code Online (Sandbox Code Playgroud)
我想从内存中删除strFile5.
您不必担心您的变量strFile5,一旦超出范围,它将被垃圾收集器收集.你不需要做任何事情.
而且,没有必要使用Rgex.Replace简单string.Replace的工作.
您也可以在单个语句中完成所有操作,而不涉及任何变量,例如:
File.WriteAllText(@"C:\Users\dennis\Desktop\regex2.txt",
File.ReadAllText(@"C:\Users\dennis\Desktop\regex.txt")
.Replace("Documents", "document2"));
Run Code Online (Sandbox Code Playgroud)
当GC不再使用时,GC会标记用于收集的局部变量.所以你不需要担心自己.
阅读:我应该设置变量为空以协助垃圾收集吗?
Jeffrey Richter在CLR中通过C#的示例:
public static void Main()
{
Timer t = new Timer(TimerCallback, null, 0, 2000);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
当集合开始时,它首先假定堆中的所有对象都是不可达的(垃圾); 这包括Timer对象.然后,收集器检查应用程序的根,并看到Main 在初始赋值后不使用t变量.因此,应用程序没有引用Timer对象的变量,垃圾收集为它回收内存; 这会停止计时器并解释为什么只调用一次TimerCallback方法.
假设您正在使用调试器来逐步执行Main,并且恰好在为t分配新Timer对象的地址后发生垃圾收集.然后,假设您尝试使用调试器的"快速监视"窗口查看t引用的对象.你认为会发生什么?调试器无法显示对象,因为它只是垃圾回收.大多数开发人员都认为这种行为非常出乎意料并且不受欢迎,因此微软已经提出了一个解决方案.
使用C#编译器的/ debug开关编译程序集时,编译器会将System.Diagnostics.DebuggableAttribute与其DebuggingModes的DisableOptimizations标志一起应用到生成的程序集中.在运行时,在编译方法时,JIT编译器会看到此标志集,并人为地将所有根的生命周期延长到方法的末尾.对于我的例子,JIT编译器欺骗自己相信Main中的t变量必须存在直到方法结束.因此,如果发生垃圾收集,垃圾收集器现在认为t仍然是根,并且t引用的Timer对象将继续可访问.Timer对象将在集合中存活,TimerCallback方法将被重复调用,直到Console.ReadLine返回并且Main退出.