C#Strings(和其他.NET API)的大小限制为2GB吗?

And*_*rew 7 .net c# string visual-studio

今天我注意到C#的String类返回一个字符串的长度作为Int.由于Int总是32位,无论架构如何,这是否意味着字符串的长度只能是2GB或更小?

一个2GB的字符串将是非常不寻常的,并提出许多问题.但是,大多数.NET api似乎都使用'int'来传达长度和计数等值.这是否意味着我们永远受限于适合32位的集合大小?

似乎是.NET API的一个基本问题.我希望通过相当于'size_t'的方式返回count和length之类的东西.

Dan*_*Tao 16

似乎是.NET API的一个基本问题......

我不知道我是否会走得那么远.

考虑几乎所有.NET中的集合类.有可能它有一个Count返回的属性int.因此,这表明该类的大小为int.MaxValue(2147483647).这不是一个真正的问题 ; 在绝大多数场景中,这是一个限制 - 而且是一个非常合理的限制.

无论如何,替代方案是什么?有uint- 但这不符合CLS.那就是long......

如果Length返回了long

  1. 如果您想知道字符串的长度,则需要额外的32位内存.
  2. 好处是:我们可以让字符串占用数十亿GB的RAM.万岁.

试着想象一下像这样的代码令人难以置信的代价:

// Lord knows how many characters
string ulysses = GetUlyssesText();

// allocate an entirely new string of roughly equivalent size
string schmulysses = ulysses.Replace("Ulysses", "Schmulysses");
Run Code Online (Sandbox Code Playgroud)

基本上,如果你认为string数据结构意味着存储无限量的文本,那么你就会有不切实际的期望.当涉及到这种大小的对象时,你是否有必要将它们保存在内存中(而不是硬盘)会变得有问题.

  • @Andrew,50年后,你不会用.NET编程.而在50年内,int.MaxValue仍然是一个容纳在集合中的大量对象. (6认同)
  • 我不明白这是怎么合理的.由于.NET将int定义为32位,这意味着50年后......无论我的计算机能处理什么,.NET都将限制我使用32位大小的集合.听起来像'640Kb的现代版本对任何人都足够了'. (4认同)
  • "640Kb"的问题在于它在很短的时间内就已经过时了.相比之下,50年是这个行业的很长一段时间.今天使用的大多数语言和技术在50年前都不存在,当时使用的大多数技术都没有生存下去(事实上,C,古代,因为它是今天的同龄人,只有38岁) .我不认为.NET字符串长度限制将成为当时的问题. (4认同)
  • @Andrew然后创建一个围绕多维`List <>/Array`的包装器并让它返回`Int64`为`Count` (2认同)

Eva*_*oli 5

正确,最大长度将是Int32的大小,但是如果你处理大于此的字符串,你可能会遇到其他内存问题.

  • @Andrew,首先在2060年使用.NET是一个问题. (4认同)
  • @Jim Schubert,我打赌有人说2010年使用COBOL同样的事情:) (3认同)