.NET中真正的字符串是什么?

时间:2008-12-10 19:52:42

标签: .net string

字符串实际上是字符数组(is-a),还是字符数组作为内部存储(has-a),还是它自己的对象可以将自身公开为带有字符数组?

我更倾向于说这是它自己的对象,但是为什么我们倾向于总是说“字符串是一个字符数组......”?

9 个答案:

答案 0 :(得分:7)

这取决于您对“字符串”一词的定义。

.NET中的

System.String类型有一个字符数组作为内部存储(它还存储长度(例如O(1)),等等。)

但是单词string意味着一般情况下连续出现的东西,这也可能意味着一个字符数组:))

顺便说一句,当我说string类型有一个“字符数组”时,我并不是指“char[]类型的字段”。我的意思是“数组”这个术语的一般含义是一个有序的集合。 :))

答案 1 :(得分:7)

.NET字符串不仅仅是一个字符数组。它包含一系列字符,严格来说,它有一个字符。

此外,还有许多与Unicode相关的细微之处在于它不像数组那样表现任何。连接字符可能不仅仅是将字符串长度增加1,而是在末尾插入新字符。根据Unicode规范化规则,它实际上可能会更改整个字符串。所以它 绝对不像一个字符数组,但是在类中的某个地方,存在这样的数组。

答案 2 :(得分:3)

字符串的语义是第二个。

.Net String类维护一个内部存储(has-a),并且可以用设计者选择的抽象方式公开该存储。

问题是“苹果是一个红色圆形的东西吗?因为我一直以为它是一种水果。”

答案 3 :(得分:1)

MSDN:字符串类型表示Unicode字符串。

这意味着:它是一个Unicode字符数组。

答案 4 :(得分:0)

以抽象的方式(我想,当在内存中布局时) - 它是一个字符数组。

如果我认为错了,请纠正我。

答案 5 :(得分:0)

String是类的名称。它在不同语言中有不同的含义。它可以是unicode或ASCII内部意味着它的存储机制是一系列字节。这个类提供了操作它自己的内部存储的功能,并不意味着它可以直接访问和修改,因为它可以包含各种不同编码的字符。所以出于你的问题的目的,它有一个字节存储。

答案 6 :(得分:0)

这取决于语言和实施。在最基本的级别(ascii char * string)上,它是一系列连续的内存地址,每个内存地址都包含一个对应于ascii代码的short int,并以null结尾(char(0))。大多数高级语言提供了一个字符串对象,具有字符数组以及便捷方法,因为使用char *字符串或多或少是后方的痛苦。

答案 7 :(得分:0)

取决于你如何看待它。如果你用GCHandle固定它,然后查看它所在的内存,你会发现它实际上是一个32位长度的描述符,后面跟着一个unicode字符数组(请注意AddrOfPinnedObject会给你第一个地址)字符,长度。如果它给出了长度的地址,它对于P / Invoking来说就没那么有用了。

答案 8 :(得分:0)

在功能上,字符串是字符的列表或序列。字符串通常作为字符数组透明地存储(例如,在C中),因此我们经常以这种方式引用它们。数组允许方便地随机访问字符,这对于某些算法很重要。

但是,出于其他目的,将Unicode字符串存储为UTF-8可能是最合适的形式。请注意,尽管它存储在字节数组中,但字节和字符之间不再存在一对一的对应关系:您的字符串算法通常需要从头开始按顺序访问字符 - 作为列表。

这个故事的寓意是:你的字符串代码应该只要求它实际需要随机访问。您可能会感到惊讶,因为您很少需要一组字符。