2008-12-10 44 views
5

字符串实际上是一个字符数组(is-a),还是它有一个字符数组作为内部存储(has-a),还是它自己的对象可以将自己暴露为一个字符数组?什么是.NET中的字符串?

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

+0

你为什么问?好奇心?你面临的一些问题? – 2008-12-10 19:56:21

+0

一个神奇的网络麻线蘸了一个gooy阵列的人物。 – Echostorm 2008-12-10 20:03:58

+0

请编辑提到.NET的问题。我根据问题标签回答。 – 2008-12-10 20:11:15

回答

7

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

此外,还有很多Unicode相关的细微之处,它不像行为像数组一样。连接一个字符可能会做的不仅仅是将字符串长度增加1,并且在结尾处插入新字符。根据Unicode规范化规则,它实际上可能会更改整个字符串。所以它绝对没有像一个字符数组,但在类的某个地方,这样的数组存在。

1

MSDN:字符串类型表示一个Unicode字符的字符串。

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

3

字符串的语义是第二个。

.Net String类维护着一个内部存储(has-a),并且可以按照设计人员选择的多种抽象方式公开该存储。

问题就像“苹果是红色的圆形的东西吗?因为我一直认为这是一个水果。”

0

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

纠正我,如果我错了以为。

7

这取决于你对单词“string”的定义。

System.String .NET中的类型有一个字符数组作为内部存储(例如,它也存储了长度(它是O(1)))。

但这个词串指一般的东西连续发生,这可能也意味着一个字符数组:))

顺便说一句,我说string类型都有一个“字符数组,”我没有” t具体指“char[]”字段。我的意思是“数组”这个术语的一般含义是有序的一些东西。 :))

0

字符串是一个类的名称。它在不同的语言中有不同的含义。它可能是unicode或ASCII内部的意思,它的存储机制是一系列字节。这个类提供了操作它自己的内部存储器的函数,并且它不能被直接访问和修改,因为它可以包含各种不同编码中的字符。因此,为了您的问题,它有一个字节存储。

0

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

0

取决于你究竟如何看待它。如果你用一个GCHandle来定位它,然后查看它驻留的内存,你会发现它实际上是一个32位长度的描述符,紧接着是一个unicode字符数组(注意AddrOfPinnedObject会给你第一个地址字符,不是的长度,如果它给出了长度的地址,它对P/Invoking的用处就会小得多)。

0

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

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

这个故事的寓意是:你的字符串代码应该只需要随机访问,如果它真的需要它。你可能很惊讶你很少需要一组字符。