Skip to content

Commit 98c0c68

Browse files
committed
Optimize Color's ToString method
1 parent 5319c20 commit 98c0c68

File tree

1 file changed

+39
-29
lines changed
  • src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media

1 file changed

+39
-29
lines changed

src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/Color.cs

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System.ComponentModel;
6+
using System.Runtime.CompilerServices;
67
using System.Runtime.InteropServices;
7-
using System.Text;
88
using MS.Internal;
99

1010
#pragma warning disable 1634, 1691 // suppressing PreSharp warnings
@@ -255,45 +255,55 @@ string IFormattable.ToString(string format, IFormatProvider provider)
255255
/// </returns>
256256
internal string ConvertToString(string format, IFormatProvider provider)
257257
{
258-
if (context == null)
258+
if (context is null)
259259
{
260-
if (format == null)
261-
{
262-
return string.Create(provider, stackalloc char[128], $"#{this.sRgbColor.a:X2}{this.sRgbColor.r:X2}{this.sRgbColor.g:X2}{this.sRgbColor.b:X2}");
263-
}
264-
else
260+
if (format is not null)
265261
{
266262
// Helper to get the numeric list separator for a given culture.
267-
char separator = MS.Internal.TokenizerHelper.GetNumericListSeparator(provider);
268-
return string.Format(provider,
269-
$"sc#{{1:{format}}}{{0}} {{2:{format}}}{{0}} {{3:{format}}}{{0}} {{4:{format}}}",
270-
separator, scRgbColor.a, scRgbColor.r, scRgbColor.g, scRgbColor.b);
263+
char separator = TokenizerHelper.GetNumericListSeparator(provider);
264+
265+
DefaultInterpolatedStringHandler stringBuilder = new(1, 7, provider, stackalloc char[128]);
266+
stringBuilder.AppendLiteral("sc#");
267+
stringBuilder.AppendFormatted(scRgbColor.a, format: format);
268+
stringBuilder.AppendFormatted(separator);
269+
stringBuilder.AppendFormatted(scRgbColor.r, format: format);
270+
stringBuilder.AppendFormatted(separator);
271+
stringBuilder.AppendFormatted(scRgbColor.g, format: format);
272+
stringBuilder.AppendFormatted(separator);
273+
stringBuilder.AppendFormatted(scRgbColor.b, format: format);
274+
275+
return stringBuilder.ToStringAndClear();
271276
}
277+
278+
return string.Create(provider, stackalloc char[128], $"#{sRgbColor.a:X2}{sRgbColor.r:X2}{sRgbColor.g:X2}{sRgbColor.b:X2}");
272279
}
273280
else
274281
{
275-
char separator = MS.Internal.TokenizerHelper.GetNumericListSeparator(provider);
282+
char separator = TokenizerHelper.GetNumericListSeparator(provider);
276283

277-
format = c_scRgbFormat;
278-
279-
//First Stepmake sure that nothing that should not be escaped is escaped
284+
// 1) Make sure that nothing that should not be escaped is escaped
280285
Uri safeUnescapedUri = new Uri(context.ProfileUri.GetComponents(UriComponents.SerializationInfoString, UriFormat.SafeUnescaped),
281-
context.ProfileUri.IsAbsoluteUri ? UriKind.Absolute : UriKind.Relative);
282-
//Second Step make sure that everything that should escaped is escaped
283-
String uriString = safeUnescapedUri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped);
284-
285-
var sb = new StringBuilder();
286-
sb.AppendFormat(provider, "{0}{1} ", Parsers.ContextColor, uriString);
287-
sb.AppendFormat(provider,"{1:" + format + "}{0}",separator,scRgbColor.a);
288-
for (int i = 0; i < nativeColorValue.Length; ++i )
286+
context.ProfileUri.IsAbsoluteUri ? UriKind.Absolute : UriKind.Relative);
287+
288+
// 2) Make sure that everything that should escaped is escaped
289+
string uriString = safeUnescapedUri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped);
290+
291+
DefaultInterpolatedStringHandler stringBuilder = new(3, 7, provider, stackalloc char[256]);
292+
293+
// Append "ContextColor file://something " format
294+
stringBuilder.AppendLiteral(Parsers.ContextColor);
295+
stringBuilder.AppendLiteral(uriString);
296+
stringBuilder.AppendLiteral(" ");
297+
298+
stringBuilder.AppendFormatted(scRgbColor.a, format: c_scRgbFormat);
299+
300+
for (int i = 0; i < nativeColorValue.Length; i++)
289301
{
290-
sb.AppendFormat(provider,"{0:" + format + "}",nativeColorValue[i]);
291-
if (i < nativeColorValue.Length - 1)
292-
{
293-
sb.AppendFormat(provider,"{0}",separator);
294-
}
302+
stringBuilder.AppendFormatted(separator);
303+
stringBuilder.AppendFormatted(nativeColorValue[i], format: c_scRgbFormat);
295304
}
296-
return sb.ToString();
305+
306+
return stringBuilder.ToStringAndClear();
297307
}
298308
}
299309

0 commit comments

Comments
 (0)