我欲穿花寻路 直入白云深处

[Unity]StringBuilder

在C#中,字符串string还是一种不可变的引用类型,在对字符串进行操作修改后,原有的字符串内存数据会被回收,代码所拿到的其实是一个新的字符串对象。在需要对字符串进行大规模的修改时,会造成GC性能的损耗,C#的标准库中提供了一个StringBuilder类用来弥补string的这个缺点。

点击查看代码
//Unity的API
 [DefaultMember("Chars")]
    public sealed class StringBuilder : ISerializable
    {
        public StringBuilder();
        public StringBuilder(int capacity);
        public StringBuilder(string value);
        public StringBuilder(int capacity, int maxCapacity);
        public StringBuilder(string value, int capacity);
        public StringBuilder(string value, int startIndex, int length, int capacity);

        public char this[int index] { get; set; }

        public int Capacity { get; set; }
        public int Length { get; set; }
        public int MaxCapacity { get; }

        public StringBuilder Append(char value, int repeatCount);
        [CLSCompliant(false)]
        public StringBuilder Append(char* value, int valueCount);
        public StringBuilder Append(byte value);
        public StringBuilder Append(bool value);
        [CLSCompliant(false)]
        public StringBuilder Append(ulong value);
        [CLSCompliant(false)]
        public StringBuilder Append(uint value);
        [CLSCompliant(false)]
        public StringBuilder Append(ushort value);
        public StringBuilder Append(char value);
        public StringBuilder Append(StringBuilder value);
        public StringBuilder Append(string value, int startIndex, int count);
        public StringBuilder Append(string value);
        public StringBuilder Append(StringBuilder value, int startIndex, int count);
        [CLSCompliant(false)]
        public StringBuilder Append(sbyte value);
        public StringBuilder Append(ReadOnlySpan<char> value);
        public StringBuilder Append(object value);
        public StringBuilder Append(long value);
        public StringBuilder Append(int value);
        public StringBuilder Append(short value);
        public StringBuilder Append(double value);
        public StringBuilder Append(char[] value);
        public StringBuilder Append(char[] value, int startIndex, int charCount);
        public StringBuilder Append(float value);
        public StringBuilder Append(decimal value);
        public StringBuilder AppendFormat(string format, params object[] args);
        public StringBuilder AppendFormat(string format, object arg0, object arg1, object arg2);
        public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0, object arg1, object arg2);
        public StringBuilder AppendFormat(string format, object arg0);
        public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args);
        public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0, object arg1);
        public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0);
        public StringBuilder AppendFormat(string format, object arg0, object arg1);
        public StringBuilder AppendJoin<T>(string separator, IEnumerable<T> values);
        public StringBuilder AppendJoin(string separator, params string[] values);
        public StringBuilder AppendJoin(string separator, params object[] values);
        public StringBuilder AppendJoin(char separator, params object[] values);
        public StringBuilder AppendJoin(char separator, params string[] values);
        public StringBuilder AppendJoin<T>(char separator, IEnumerable<T> values);
        public StringBuilder AppendLine();
        public StringBuilder AppendLine(string value);
        public StringBuilder Clear();
        public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);
        public void CopyTo(int sourceIndex, Span<char> destination, int count);
        public int EnsureCapacity(int capacity);
        public bool Equals(StringBuilder sb);
        public bool Equals(ReadOnlySpan<char> span);
        [CLSCompliant(false)]
        public StringBuilder Insert(int index, ulong value);
        [CLSCompliant(false)]
        public StringBuilder Insert(int index, uint value);
        [CLSCompliant(false)]
        public StringBuilder Insert(int index, ushort value);
        public StringBuilder Insert(int index, string value, int count);
        public StringBuilder Insert(int index, float value);
        [CLSCompliant(false)]
        public StringBuilder Insert(int index, sbyte value);
        public StringBuilder Insert(int index, ReadOnlySpan<char> value);
        public StringBuilder Insert(int index, string value);
        public StringBuilder Insert(int index, int value);
        public StringBuilder Insert(int index, bool value);
        public StringBuilder Insert(int index, byte value);
        public StringBuilder Insert(int index, long value);
        public StringBuilder Insert(int index, char value);
        public StringBuilder Insert(int index, object value);
        public StringBuilder Insert(int index, char[] value, int startIndex, int charCount);
        public StringBuilder Insert(int index, decimal value);
        public StringBuilder Insert(int index, double value);
        public StringBuilder Insert(int index, short value);
        public StringBuilder Insert(int index, char[] value);
        public StringBuilder Remove(int startIndex, int length);
        public StringBuilder Replace(char oldChar, char newChar, int startIndex, int count);
        public StringBuilder Replace(string oldValue, string newValue);
        public StringBuilder Replace(string oldValue, string newValue, int startIndex, int count);
        public StringBuilder Replace(char oldChar, char newChar);
        public override string ToString();
        public string ToString(int startIndex, int length);
    }

从上面的API我们可以看出来StringBuilder具有值类型兼容性、增删改查、文本格式化等功能。当对StringBuilder修改后,返回的是原来的StringBuilder对象,重复使用StringBuilder实例,可以减少不必要的内存分配。
StringBuilder的使用也十分简单,一个简单的例子:将一个字符串数组的元素拼接成一个字符串,并以/分隔

点击查看代码
        List<string> stringArr = new List<string> { "A", "B", "C" };
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < stringArr.Count; i++)
        {
            sb.Append(stringArr[i] + "/");
        }
        string result = sb.ToString();
posted @ 2024-07-12 22:39  根结点可不就是孤儿  阅读(12)  评论(0编辑  收藏  举报