在不浪费内存的情况下读取文本文件

时间:2015-10-17 03:33:57

标签: c# streamreader

我用get创建了一个名为line的字符串变量;并设定;在csharp。 之后,我使用此变量在while循环中读取文本文件,如下所示。

using(StreamReader Reader = new StreamReader(pathtofile))
{
    while((line = Reader.ReadLine()) != null)
    {
       //things to do with the line using regex expressions.
    }
}

我知道csharp中的字符串是不可变的。所以我怀疑每次读取行时,是否会创建一个新的字符串,从而产生一个占用大量内存的唯一行变量。怎么解决?我希望变量只创建一次,并且每个行都使用相同的变量,而内存中没有多行变量。我不知道如何解决这个问题。有人试图解释真实场景吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果您使用的是get;set;,那么您要声明属性,而不是字段(即变量)。坦率地说,您可能应该在循环中将{em> local 变量声明为string line;,但如果没有a good, minimal, complete code example则无法确定。

就目前的问题而言,否:将新值重新分配给变量不会创建新变量。变量的生命周期取决于它的声明方式,而不是指定给它的频率。

在阅读文件时,将为每行的变量分配一个新值(即string引用)。这将覆盖旧值。假设没有其他变量保留对旧值的引用,那么该值引用的string对象最终将被垃圾收集器丢弃。

可能会立即丢弃,也可能不会立即丢弃。通常,GC的操作对您自己的代码是透明的。它在幕后工作,以确保您的程序不会消耗超出其需要的内存,同时还确保不会花费太多时间来将内存消耗降至最低(即通过允许"垃圾和#34;积累到一定程度,而不是总是试图立即释放所有东西,它使用更少的CPU时间管理内存。)

这就是说,不...你发布的代码不会浪费内存。实际上,它是一种惯用的方法,可以在不浪费内存的情况下逐行读取文本文件 。与例如像File.ReadAllLines()TextReader.ReadToEnd(),它们尝试将整个文件内容一次性存储在内存中。