【发布时间】:2018-01-29 05:11:20
【问题描述】:
我有一个 C# 桌面应用程序,它将获取 RTF 文本块(大小不一,但在较大的块中可能超过 ~20k),然后用数据库记录中的值替换占位符文本(例如“亲爱的 [姓名]”将变为“亲爱的约翰·史密斯”)。对于这个问题的所有意图和目的,假设这是一个邮件合并,并且其他人正在管理模板,但 C# 将读取模板并合并值。
现在,我已经阅读了关于 SO 的几个类似问题。我了解字符串是不可变的,并且您可以强制运行 GC 以清理未引用的字符串。
我不想使用 3rd 方字符串模板库来解决这个问题,因为我想更好地理解这里应该采用的正确机制以及其他意见。
我目前的想法是将模板预处理成一个可能看起来像这样的列表(例如,我使用纯文本字符串而不是 RTF 文本):
List<string> lstTemplate = new List<string>()
{
"The quick brown ",
"[Animal1]",
" jumped over the lazy ",
"[Animal2]"
};
然后我会使用 StringBuilder 来组装这些片段,以避免在内存中有大量模板的部分副本:
Dictionary<string,string> exampleDataRecord = new Dictionary<string,string>()
{
{ "[Animal1]", "fox" },
{ "[Animal2]", "dog" }
};
StringBuilder sbMerged = new StringBuilder();
foreach(string piece in lstTemplate)
{
if((piece[0] == '[') && (piece[piece.Length-1] == ']'))
{
// Append the variable from the data record
sbMerged.Append(exampleDataRecord[piece]);
}
else
{
// Append the template content
sbMerged.Append(piece);
}
}
// Display the final, merged result
rtfMyRichTextBox.Text = sbMerged.Text;
这个过程可能平均每天运行数千次,所以我想我会在应用程序期间将预处理的字符串列表保存在内存中。
我的问题是 - 这是解决这个问题的好方法,不会导致大量内存浪费或强制 GC?我认为当 RTF 文本框处理时,它将摆脱合并的文本内容,并且 StringBuilder 应该避免内存中大量部分构建的字符串。
但是,我无法摆脱我错过了什么的感觉,或者我只是盯着它太久了。
【问题讨论】:
标签: c# string templates memory-management