字符串连接是将字符串追加到另一个字符串后面以形成更大字符串,这样的操作容易导致堆内存的过量分配。字符串连接大概有以下3种方式。
1.使用+操作符和+=操作符,这种方式最容易导致内存浪费的,因为它会导致分配链效应。每次+操作会产生1个临时的字符串,直到产生最终的字符串。
2.使用StringBuilder,如果我们可以提前知道字符串的最终大小,那么可以提前分配一个适当的缓冲区,以减少不必要的内存分配。它有点儿类似动态数组,如果当前已分配的内存空间不够时,会分配额外的。当然,最好是提前能预估合适的缓冲区,即避免浪费,也避免不够时的拓展。
3.字符串格式化API:string.Format()/string.Join()/string.Concat()。当我们如果无法知道最终字符串的大小时,使用方法2显然不合适。分配一个新的字符串对象,包含传入的字符串对象内容,一步完成,没有多余的字符串分配。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
/*
* Author:W
* 字符串连接
*/
public class StringConnectTest : MonoBehaviour {
string str1 = "Wang";
string str2 = "Lun";
string str3 = "Qiang";
void Start()
{
StringConnect1();
StringConnect2();
StringConnect3();
StringConnect4();
StringConnect5();
}
/// <summary>
/// 字符串+操作符连接
/// </summary>
private void StringConnect1()
{
string str = str1 + str2 + str3;
Debug.Log("+操作符连接===="+str);
}
/// <summary>
/// StringBuilder
/// </summary>
private void StringConnect2()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append(str1);
stringBuilder.Append(str2);
stringBuilder.Append(str3);
string str = stringBuilder.ToString();
Debug.Log("stringBuilder ====" + str);
}
/// <summary>
/// 字符串格式化1-string.format()
/// </summary>
private void StringConnect3()
{
string str = string.Format("{0} {1} {2}",str1,str2,str3);
Debug.Log("string.Format()====" + str);
}
/// <summary>
/// 字符串格式2-string.Join()
/// </summary>
private void StringConnect4()
{
string str = string.Join(" ",new string[] { str1,str2,str3});
Debug.Log("string.Join()====" + str);
}
/// <summary>
/// 字符串格式3-string.Concat()
/// </summary>
private void StringConnect5()
{
string str = string.Concat(str1,str2,str3);
Debug.Log("string.Concat====" + str);
}
}
总结:使用+操作符连接字符串,确实比较方便。如果发现使用它时发现性能不佳时,可以考虑使用其他方式。