String optimisations
diff --git a/src/ProtocolBuffers/CodedInputStream.cs b/src/ProtocolBuffers/CodedInputStream.cs
index b7fe9c3..78d9251 100644
--- a/src/ProtocolBuffers/CodedInputStream.cs
+++ b/src/ProtocolBuffers/CodedInputStream.cs
@@ -219,16 +219,19 @@
     /// </summary>
     public String ReadString() {
       int size = (int) ReadRawVarint32();
-      if (size < bufferSize - bufferPos && size > 0) {
+      // No need to read any data for an empty string.
+      if (size == 0) {
+        return "";
+      }
+      if (size <= bufferSize - bufferPos) {
         // Fast path:  We already have the bytes in a contiguous buffer, so
         //   just copy directly from it.
         String result = Encoding.UTF8.GetString(buffer, bufferPos, size);
         bufferPos += size;
         return result;
-      } else {
-        // Slow path:  Build a byte array first then copy it.
-        return Encoding.UTF8.GetString(ReadRawBytes(size));
       }
+      // Slow path:  Build a byte array first then copy it.
+      return Encoding.UTF8.GetString(ReadRawBytes(size));
     }
 
     /// <summary>