Using List<Char> instead of StringBuilder for building strings from chars
diff --git a/src/ProtocolBuffers/Serialization/JsonTextCursor.cs b/src/ProtocolBuffers/Serialization/JsonTextCursor.cs
index a2a5b73..6a8652c 100644
--- a/src/ProtocolBuffers/Serialization/JsonTextCursor.cs
+++ b/src/ProtocolBuffers/Serialization/JsonTextCursor.cs
@@ -156,7 +156,7 @@
         {

             SkipWhitespace();

             Consume('"');

-            StringBuilder sb = new StringBuilder();

+            List<Char> sb = new List<char>(100);

             while (_next != '"')

             {

                 if (_next == '\\')

@@ -165,54 +165,53 @@
                     char ch = ReadChar();

                     switch (ch)

                     {

-                        case 'b': sb.Append('\b'); break;

-                        case 'f': sb.Append('\f'); break;

-                        case 'n': sb.Append('\n'); break;

-                        case 'r': sb.Append('\r'); break;

-                        case 't': sb.Append('\t'); break;

+                        case 'b': sb.Add('\b'); break;

+                        case 'f': sb.Add('\f'); break;

+                        case 'n': sb.Add('\n'); break;

+                        case 'r': sb.Add('\r'); break;

+                        case 't': sb.Add('\t'); break;

                         case 'u':

                             {

                                 string hex = new string(new char[] { ReadChar(), ReadChar(), ReadChar(), ReadChar() });

                                 int result;

                                 Assert(int.TryParse(hex, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out result),

                                        "Expected a 4-character hex specifier.");

-                                sb.Append((char)result);

+                                sb.Add((char)result);

                                 break;

                             }

                         default:

-                            sb.Append(ch); break;

+                            sb.Add(ch); break;

                     }

                 }

                 else

                 {

                     Assert(_next != '\n' && _next != '\r' && _next != '\f' && _next != -1, '"');

-                    sb.Append(ReadChar());

+                    sb.Add(ReadChar());

                 }

             }

             Consume('"');

-            return sb.ToString();

+            return new String(sb.ToArray());

         }

 

         public string ReadNumber()

         {

             SkipWhitespace();

-

-            StringBuilder sb = new StringBuilder();

+            List<Char> sb = new List<char>(24);

             if (_next == '-')

-                sb.Append(ReadChar());

+                sb.Add(ReadChar());

             Assert(_next >= '0' && _next <= '9', "Expected a numeric type.");

             while ((_next >= '0' && _next <= '9') || _next == '.')

-                sb.Append(ReadChar());

+                sb.Add(ReadChar());

             if (_next == 'e' || _next == 'E')

             {

-                sb.Append(ReadChar());

+                sb.Add(ReadChar());

                 if (_next == '-' || _next == '+')

-                    sb.Append(ReadChar());

+                    sb.Add(ReadChar());

                 Assert(_next >= '0' && _next <= '9', "Expected a numeric type.");

                 while (_next >= '0' && _next <= '9')

-                    sb.Append(ReadChar());

+                    sb.Add(ReadChar());

             }

-            return sb.ToString();

+            return new String(sb.ToArray());

         }

 

         public JsType ReadVariant(out object value)