com.alicizax.unity.framework/Runtime/ABase/Extension/System/ToStringNonAllocExtensions.cs

69 lines
1.8 KiB
C#

using System;
using System.Threading;
using Cysharp.Text;
public static class ToStringNonAllocExtensions
{
// 使用 ThreadLocal 确保线程安全
private static readonly ThreadLocal<Utf16ValueStringBuilder> ThreadLocalStringBuilder =
new ThreadLocal<Utf16ValueStringBuilder>(() => ZString.CreateStringBuilder(), true);
public static string ToStringNonAlloc(this int value)
{
var sb = ThreadLocalStringBuilder.Value;
sb.Clear();
sb.Append(value);
return sb.ToString();
}
public static string ToStringNonAlloc(this float value)
{
var sb = ThreadLocalStringBuilder.Value;
sb.Clear();
sb.Append(value);
return sb.ToString();
}
public static string ToStringNonAlloc(this double value)
{
var sb = ThreadLocalStringBuilder.Value;
sb.Clear();
sb.Append(value);
return sb.ToString();
}
public static string ToStringNonAlloc(this bool value)
{
var sb = ThreadLocalStringBuilder.Value;
sb.Clear();
sb.Append(value);
return sb.ToString();
}
public static string ToStringNonAlloc(this string value)
{
var sb = ThreadLocalStringBuilder.Value;
sb.Clear();
sb.Append(value);
return sb.ToString();
}
public static string ToStringNonAlloc<T>(this T value) where T : IFormattable
{
var sb = ThreadLocalStringBuilder.Value;
sb.Clear();
sb.AppendFormat(null, "{0}", value);
return sb.ToString();
}
// 释放所有 ThreadLocal 的实例
public static void Dispose()
{
if (ThreadLocalStringBuilder.IsValueCreated)
{
ThreadLocalStringBuilder.Value.Dispose();
}
ThreadLocalStringBuilder.Dispose();
}
}