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

1 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);
Run Code Online (Sandbox Code Playgroud)

我想从内存中删除strFile5.

Hab*_*bib 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"));
Run Code Online (Sandbox Code Playgroud)

  • @GlorinOakenfoot,如果它包含敏感数据,那么最好使用[`SecureString`](https://msdn.microsoft.com/en-us/library/system.security.securestring(v = vs.110)的.aspx) (4认同)

Zei*_*kki 5

当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退出.