Update StringBuilder.AppendJoin to approved API (#11059)
authorJoseph Musser <me@jnm2.com>
Fri, 21 Apr 2017 01:54:30 +0000 (21:54 -0400)
committerDan Moseley <danmose@microsoft.com>
Fri, 21 Apr 2017 01:54:30 +0000 (18:54 -0700)
* Updated StringBuilder.AppendJoin to approved API

* Organized StringBuilder.AppendJoin overloads

* Added ThrowHelper, removed Contract.Ensures

* Inline array accesses

src/mscorlib/shared/System/Text/StringBuilder.cs
src/mscorlib/src/System/ThrowHelper.cs

index df1a889..3a06114 100644 (file)
@@ -1081,67 +1081,56 @@ namespace System.Text
             return this;
         }
 
-        // Append joined values with a separator between each value.
-        public unsafe StringBuilder AppendJoin<T>(char separator, params T[] values)
-        {
-            // Defer argument validation to the internal function
-            return AppendJoinCore(&separator, 1, values);
-        }
+        
+        #region AppendJoin
 
-        public unsafe StringBuilder AppendJoin<T>(string separator, params T[] values)
+        public unsafe StringBuilder AppendJoin(string separator, params object[] values)
         {
             separator = separator ?? string.Empty;
             fixed (char* pSeparator = separator)
             {
-                // Defer argument validation to the internal function
                 return AppendJoinCore(pSeparator, separator.Length, values);
             }
         }
 
-        public unsafe StringBuilder AppendJoin<T>(char separator, IEnumerable<T> values)
+        public unsafe StringBuilder AppendJoin<T>(string separator, IEnumerable<T> values)
         {
-            // Defer argument validation to the internal function
-            return AppendJoinCore(&separator, 1, values);
+            separator = separator ?? string.Empty;
+            fixed (char* pSeparator = separator)
+            {
+                return AppendJoinCore(pSeparator, separator.Length, values);
+            }
         }
 
-        public unsafe StringBuilder AppendJoin<T>(string separator, IEnumerable<T> values)
+        public unsafe StringBuilder AppendJoin(string separator, params string[] values)
         {
             separator = separator ?? string.Empty;
             fixed (char* pSeparator = separator)
             {
-                // Defer argument validation to the internal function
                 return AppendJoinCore(pSeparator, separator.Length, values);
             }
         }
 
-        private unsafe StringBuilder AppendJoinCore<T>(char* separator, int separatorLength, params T[] values)
+        public unsafe StringBuilder AppendJoin(char separator, params object[] values)
         {
-            if (values == null)
-                throw new ArgumentNullException(nameof(values));
-            Contract.Ensures(Contract.Result<StringBuilder>() != null);
-
-            if (values.Length == 0)
-                return this;
+            return AppendJoinCore(&separator, 1, values);
+        }
 
-            var value = values[0];
-            if (value != null)
-                Append(value.ToString());
+        public unsafe StringBuilder AppendJoin<T>(char separator, IEnumerable<T> values)
+        {
+            return AppendJoinCore(&separator, 1, values);
+        }
 
-            for (var i = 1; i < values.Length; i++)
-            {
-                Append(separator, separatorLength);
-                value = values[i];
-                if (value != null)
-                    Append(value.ToString());
-            }
-            return this;
+        public unsafe StringBuilder AppendJoin(char separator, params string[] values)
+        {
+            return AppendJoinCore(&separator, 1, values);
         }
 
+        
         private unsafe StringBuilder AppendJoinCore<T>(char* separator, int separatorLength, IEnumerable<T> values)
         {
             if (values == null)
-                throw new ArgumentNullException(nameof(values));
-            Contract.Ensures(Contract.Result<StringBuilder>() != null);
+                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.values);
 
             using (var en = values.GetEnumerator())
             {
@@ -1163,6 +1152,29 @@ namespace System.Text
             return this;
         }
 
+        private unsafe StringBuilder AppendJoinCore<T>(char* separator, int separatorLength, T[] values)
+        {
+            if (values == null)
+                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.values);
+
+            if (values.Length == 0)
+                return this;
+
+            if (values[0] != null)
+                Append(values[0].ToString());
+
+            for (var i = 1; i < values.Length; i++)
+            {
+                Append(separator, separatorLength);
+                if (values[i] != null)
+                    Append(values[i].ToString());
+            }
+            return this;
+        }
+
+        #endregion
+
+
         /*====================================Insert====================================
         **
         ==============================================================================*/
index 4dcf8d4..ff76738 100644 (file)
@@ -416,6 +416,7 @@ namespace System
         type,
         stateMachine,
         pHandle,
+        values
     }
 
     //