使用正则表达式和清理字符串内存
本文关键字:字符串 内存 正则表达式 | 更新日期: 2023-09-27 18:01:04
我在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。
您不必担心变量strFile5
,一旦超出范围,它将被垃圾收集器收集。没有什么你必须做的。
此外,不需要使用Rgex.Replace
,一个简单的string.Replace
就可以完成这项工作。
您也可以在一个语句中完成这一切,而不涉及任何变量,如:
File.WriteAllText(@"C:'Users'dennis'Desktop'regex2.txt",
File.ReadAllText(@"C:'Users'dennis'Desktop'regex.txt")
.Replace("Documents", "document2"));
GC标记不再使用的局部变量以供收集。所以你不需要担心你自己。
阅读:我应该将变量设置为Null以帮助垃圾收集吗?
Jeffrey Richter通过C#在CLR中的示例:
public static void Main()
{
Timer t = new Timer(TimerCallback, null, 0, 2000);
Console.ReadLine();
}
当集合开始时,它首先假设堆无法访问(垃圾(;这包括Timer对象。然后收集器检查应用程序的根,发现Main在初始赋值后不使用t变量。因此,应用程序没有引用Timer的变量对象,并且垃圾回收为其回收内存;这停止计时器并解释调用TimerCallback方法的原因只有一次。
假设您正在使用调试器逐步执行Main垃圾回收恰好发生在t被分配新Timer对象的地址。然后,假设您尝试查看t通过使用调试器的快速监视引用的对象窗你认为会发生什么调试器无法显示对象,因为它只是垃圾收集。这种行为会被大多数开发人员认为是非常出乎意料和不受欢迎的,因此微软提出了一个解决方案。
当您使用C#编译器的/debug开关编译程序集时,编译器应用系统。诊断。DebugableAttribute及其DebuggingModes的DisableOptimizations标志设置到结果中装配在运行时,当编译一个方法时,JIT编译器会看到该标志设置,并人为地将所有根的寿命延长到方法的结束。在我的例子中,JIT编译器欺骗了自己相信Main中的t变量必须生存到方法因此,如果要进行垃圾收集collector现在认为t仍然是根,并且Timer对象t所指的将继续是可到达的。Timer对象将在集合中幸存,并且将调用TimerCallback方法重复直到控制台。ReadLine返回,Main退出。