C#字符串对象之间共享字符缓冲区(Sharing character buffer between

2019-09-16 09:25发布

这可能吗? 考虑到C#使用不可改变的字符串,可以预期会有沿着线的方法:

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

如果没有这样的功能,所以有做串不可变麻烦? 或者,如果字符串是不可改变已经因其他原因,为什么不提供这个方法?

我在寻找这个具体原因正在做一些文件解析。 简单的递归下降解析器(如一个由TinyPG产生,或那些用手随便写)使用的串所有的地方。 这意味着,如果你给他们一个大的文件来分析,内存流失是令人难以置信的。 当然也有变通方法 - 基本上推出自己的子类,然后当然忘掉能够使用字符串的方法,如StartsWith或字符串库如正则表达式,所以你需要推出自己的这些版本,以及。 我假设解析器生成如ANTLR基本上做到这一点,但我的格式是很简单的不使用这样的庞然大物工具来证明。 即使TinyPG可能是矫枉过正。

有人告诉我,我错过了一些明显或不那么明显的标准的C#方法调用的地方...

Answer 1:

没有,有一点也不像。

.NET串直接包含其文本数据,不同于具有到字符数组,偏移和长度的参考Java字符串。

这两种解决方案在其他一些情况下,“胜利”,和损失。

如果你绝对相信这将是一个杀手,你可以实现使用Java风格的字符串,在自己的内部API。



Answer 2:

据我所知,所有较大的解析器使用流的解析。 是不是适合你的情况吗?



Answer 3:

在.NET框架支持的字符串实习 。 这是一个局部的解决方案,但不提供posibility重用部分字符串。 我想重用子会造成一些问题,不是obviouse在第一样子。 如果你做了很多使用字符串操作的StringBuilder的是要走的路。



Answer 4:

在C#中没有为您提供您正在寻找的出的现成功能。

什么要的是绳的数据结构 ,它支持ö一个不可变的数据结构(1)和concats O(log n)的子串。 我找不到绳子的任何C#实现,但这里一个Java一个 。

除非是,没有什么错误使用TinyPG或ANTLR,如果这是为了把事情做好最简单的方法。



Answer 5:

那么你可以使用“不安全”做内存管理自己,这可能让你做你在找什么。 此外StringBuilder类是伟大的,其中一个字符串需要被操纵无数次,因为它不会使每个操作一个新的字符串的情况。



Answer 6:

你可以很容易地编写一个简单的类来表示“便宜”。 它只是保持字符串的开始和字符串长度的索引。 一对夫妇的方法可以让您阅读时所需要的子了 - 一个字符串转换运算将是理想的,因为你可以使用

string text = myCheapObject;

它会无缝地工作,就好像它是一个实际的字符串。 添加了一些方便的方法,如StartsWith支持将是快速和容易的(他们全是一个衬垫)。

另一种选择是写一个普通解析器和您的令牌存储在一个字典,从中分享到令牌引用而不是保持多个副本。



文章来源: Sharing character buffer between C# strings objects