Документация и язык варьируются между VS 2008 и 2010:
VS 2008 Документация
Внутри текст хранится как коллекция только для чтения объектов Char, каждый из которых представляет один символ Unicode, закодированный в UTF-16 . ... Длина строки представляет количество символов независимо от того, сформированы они из суррогатных пар Unicode или нет. Чтобы получить доступ к отдельным кодовым точкам Unicode в строке, используйте объект StringInfo. - http://msdn.microsoft.com/en-us/library/ms228362%28v=vs.90%29.aspx
VS 2010 Документация
Внутри текст хранится как последовательная коллекция только для чтения объектов Char . ... Свойство Length строки представляет количество содержащихся в ней объектов Char, а не количество символов Unicode. Чтобы получить доступ к отдельным кодовым точкам Unicode в строке, используйте объект StringInfo. - http://msdn.microsoft.com/en-us/library/ms228362%28v=VS.100%29.aspx
Язык, используемый в обоих случаях, не проводит четкого различия между «символом», «символом Unicode», «классом Char», «суррогатной парой Unicode» и «кодовой точкой Unicode».
Язык в документации к VS2008, в котором говорится, что «строка представляет количество символов независимо от того, сформированы ли символы из суррогатных пар Unicode или нет« кажется, что определяет » символ "как объект, который может быть результатом суррогатной пары Unicode, что предполагает, что она может представлять 4-байтовую последовательность, а не 2-байтовую последовательность. В начале также конкретно указывается, что объект "char" закодирован в UTF-16, что предполагает, что он может представлять суррогатную пару (4 байта вместо 2). Я вполне уверен, что это неправильно.
Документация VS2010 немного более точна. Он проводит различие между «char» и «Unicode-символом», но не между «Unicode-символом» и «Unicode code point». Если кодовая точка относится к половине суррогатной пары, а «символ Unicode» представляет собой полную пару, то класс «Char» назван неправильно и вообще не ссылается на «символ Unicode» (что, как они утверждают, делает нет), и это действительно код Unicode.
Так верно ли оба следующих утверждения? (Да, я думаю.)
- String.Length представляет длину кодовой точки Unicode, а
- String.Length не представляет ни длину символа Unicode, ни то, что мы считаем истинной длиной символа (количество отображаемых символов), а скорее количество объектов "Char", каждый из которых представляет кодовую точку Unicode. (не символ Юникода).