这可能吗?鉴于 C# 使用不可变字符串,可以预期会有一种方法如下:
var expensive = ReadHugeStringFromAFile();
var cheap = expensive.SharedSubstring(1);
如果没有这样的功能,为什么还要让字符串不可变呢?或者,如果字符串由于其他原因已经是不可变的,为什么不提供这种方法呢?
我正在调查的具体原因是进行一些文件解析。简单的递归下降解析器(例如由 TinyPG 生成的解析器,或易于手工编写的解析器)到处都使用 Substring。这意味着如果你给他们一个大文件来解析,内存流失是难以置信的。当然有变通办法——基本上是滚动您自己的 SubString 类,然后当然忘记能够使用诸如 StartsWith 之类的 String 方法或诸如 Regex 之类的 String 库,因此您也需要滚动您自己的版本。我假设像 ANTLR 这样的解析器生成器基本上可以做到这一点,但我的格式很简单,无法证明使用这种怪物工具是合理的。即使是 TinyPG 也可能是矫枉过正。
有人请告诉我,我在某处遗漏了一些明显或不那么明显的标准 C# 方法调用......