这可能吗?鉴于 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/