c# - 在 C# 字符串对象之间共享字符缓冲区

标签 c# parsing memory-management substring

这可能吗?鉴于 C# 使用不可变字符串,可以预期会有一种方法如下:

var expensive = ReadHugeStringFromAFile();
var cheap = expensive.SharedSubstring(1);

如果没有这样的函数,为什么还要费心让字符串不可变呢? 或者,如果字符串由于其他原因已经不可变,为什么不提供此方法?

我正在研究这个的具体原因是进行一些文件解析。简单的递归下降解析器(例如由 TinyPG 生成的解析器,或易于手工编写的解析器)到处都使用 Substring。这意味着如果你给他们一个大文件来解析,内存流失是难以置信的。当然有变通方法——基本上推出您自己的 SubString 类,然后当然忘记能够使用 String 方法(例如 StartsWith)或 String 库(例如 Regex),因此您也需要推出您自己的版本。我假设像 ANTLR 这样的解析器生成器基本上可以做到这一点,但我的格式很简单,不能证明使用这样一个怪物工具是合理的。即使是 TinyPG 也可能有点矫枉过正。

请有人告诉我,我在某处遗漏了一些明显或不太明显的标准 C# 方法调用......

最佳答案

不,没有那样的东西。

.NET 字符串直接包含它们的文本数据,这与 Java 字符串不同,Java 字符串具有对 char 数组、偏移量和长度的引用。

这两种解决方案在某些情况下都有“胜利”,而在其他情况下则有损失。

如果您绝对确定这对您来说是一个 killer ,您可以实现一个 Java 风格的字符串以用于您自己的内部 API。

关于c# - 在 C# 字符串对象之间共享字符缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1003915/

相关文章:

c# - C#StreamReader无法读取行

C#:将作业分包给多处理器机器上的工作进程

java - 如何从 HTML 文档中仅提取粗体文本?

mysql - MySQL中将字符串存储为varchar的内存占用

arrays - MATLAB 如何处理动态数组分配?

c# - 将 WPF 组合框项目源绑定(bind)到另一个 .cs 文件中的属性

c# - 如何使用 DocumentDb 从 HttpTrigger 路由中提取分区键?

python - 解析 objdump 输出

java - 解析和替换字符串中的值

android - 使用位图和 Volley 查看寻呼机内存泄漏