如何正确清除包含结构体的队列
本文关键字:队列 结构体 包含 何正确 清除 | 更新日期: 2023-09-27 18:05:50
我已经声明了一个像这样的基本结构体
private struct ValLine {
public string val;
public ulong linenum;
}
并像这样声明一个Queue
Queue<ValLine> check = new Queue<ValLine>();
然后在使用StreamReader设置中,我在while循环中使用ReadLine读取输入文件的行,除其他外,我这样做是为了填充队列:
check.Enqueue(new ValLine { val = line, linenum = linenum });
("line"是包含每行文本的字符串,"linenum"只是一个计数器,初始值为0,每次循环递增)
"check"队列的目的是,如果某一行满足某些条件,那么我将该行与它在输入文件中出现的行号一起存储在"check"中。
在我读完输入文件之后,我用"check"来表示各种东西,但是当我用完它之后,我用一种明显的方式把它清除掉:
check.Clear();
(或者,在通过"check"的最后一个循环中,我可以直接使用. dequeue(),而不是foreach。)
但随后我开始思考-等一下,我在填充队列时生成的所有"新ValLine"怎么办?我是否造成了内存泄漏?我对c#很陌生,所以我不清楚如何处理这个问题——甚至不知道是否应该处理这个问题(也许. clear()或. dequeue()会自动处理现在已经过时的结构体?)我花了一个多小时在我们亲爱的朋友Google上,只是没有找到任何关于这类例子的关于清除结构集合的具体讨论。
所以…在c#中,我们是否需要在清除队列之前(或者在我们退出队列时)处理清除单个结构?如果是这样,那么正确的做法是什么?
(以防万一,我在Visual Studio 2013中使用。net 4.5)
更新:这是为了将来参考(你知道,就像如果这个页面出现在谷歌搜索)在适当的编码。按照建议,要使结构不可变,下面是我最后所做的:
private struct ValLine {
private readonly string _val;
private readonly ulong _linenum;
public string val { get { return _val; } }
public ulong linenum { get { return _linenum; } }
public ValLine(string x, ulong n) { _val = x; _linenum = n; }
}
与此变化相对应,队列人口线现在是:
check.Enqueue(new ValLine(line,linenum));
此外,虽然不是严格必要的,我确实摆脱了队列上的foreach(和check.Clear();
),并将其更改为
while (check.Count > 0) {
ValLine ll = check.Dequeue();
writer.WriteLine("[{0}] {1}", ll.linenum, ll.val);
}
以便在输出信息时清空队列。
更新2:好吧,是的,我仍然是一个c#新手(不到一年)。我从网上学到了很多东西,当然,我经常看一年前的例子。我已经改变了我的结构,所以现在它看起来像这样:
private struct ValLine {
public string val { get; private set; }
public ulong linenum { get; private set; }
public ValLine(string x, ulong n): this()
{ this.val = x; this.linenum = n; }
}
有趣的是,在我想到第一个更新(上面)之前,我实际上已经尝试过了,但是得到了一个编译错误(因为我没有构造函数的: this()
)。在进一步的建议下,我进一步检查并发现了一个最近的例子,显示: this()
使它像我以前尝试过的那样工作,插入它,然后-哇啦!-干净编译。我喜欢代码简洁的外观。私有变量的名称与我无关。
不,您不会创建内存泄漏。调用Clear
或Dequeue
将适当地清除内存—例如,如果您有List<T>
,那么清除操作可能使用:
for (int i = 0; i < capacity; i++)
{
array[i] = default(T);
}
我不知道Queue<T>
是用一个建立在数组上的循环缓冲区实现的,还是一个链表-但无论哪种方式,你都会很好。
话虽如此,我还是强烈建议不要像这里那样使用可变结构体和可变字段。虽然它不会引起您所设想的特定问题,但它们会以令人困惑的方式表现。