Документация и язык различаются между VS 2008 и 2010:
Документация VS 2008
Внутри текст хранится как сборка только для чтения объектов Char, каждая из которых представляет один символ Юникода, закодированный в 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 class", "суррогатной парой Unicode" и "кодовой точкой Unicode".
Язык в документации VS2008, в котором указано, что "строка представляет количество символов, независимо от того, сформированы ли символы из суррогатных пар Unicode или нет", как представляется, определяет "символ" как объект, который может быть результатом Юникод-суррогатная пара, которая предполагает, что она может представлять собой 4-байтную последовательность, а не 2-байтную последовательность. В нем также вначале указывается, что объект "char" кодируется в UTF-16, что предполагает, что он может представлять суррогатную пару (4 байта вместо 2). Я уверен, что это неправильно.
Документация VS2010 немного точнее. Он проводит различие между "char" и "символом Unicode" , но не между "символом Unicode" и "кодовой точкой Unicode". Если кодовая точка относится к половине суррогатной пары, а "символ Юникода" представляет полную пару, то класс "char" назван неправильно и вообще не ссылается на "символ Юникода" (который они определяют это не так), и это действительно кодовая точка Unicode.
Итак, оба утверждения справедливы? (Да, я думаю.)
- String.Length представляет длину кодовой строки Unicode и
- String.Length не представляет ни длину символа Юникода, ни то, что мы будем считать истинной длиной символа (количество символов, которое будет отображаться), а количество объектов "char", каждое из которых представляет собой Unicode (не символ Юникода).