个人对string 與stringbuild做个终极小结!!!
1; 不同點,string可以直接用來聲明一個字符串類型 ,但是stringbuild不可以直接聲明,它是一個類,必須用聲明實例的方式才能聲明一個字符類型
如:StringBuild str1 =new StringBuild(“hello,world”);
//聲明一個str1的實例,賦初值為”hello,world”;
2; string與stringbuild均是引用類型,但是也不完全是引用類型,str1直接存放在棧上,而初始化值直接存放在 堆上。但是stringbuild是一個完全引用類型,連定義都與類一致。
但是string 卻不完全是引用類型。
如:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string str1 ="hello,world";
Console.WriteLine(str1);
string str2 =str1;
Console.WriteLine(str2);
str1 = "this is just test";
Console.WriteLine(str1); //再次 輸入的時候就輸出為空了,str1,str2均為空
Console.WriteLine(str2);
Console.ReadLine();
}
}
}
我們會發現,當我們將str1重新賦值的時候,str2并沒有改變,原因是因為string類型一旦賦值則不能改變,而當重新進行賦值的時候,只是在堆上重新創建了一個副本,因此,此時str1指向了新的賦值引用,而str2仍然引用的是之前的str1值。
再來看看stringbuild:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
StringBuilder str1 = new StringBuilder("hello,world"); //定義一個stringbuild的實例str1,并賦初值
Console.WriteLine(str1);
StringBuilder str2 = new StringBuilder(); //再定義一個實例str2,并指向str1
str2 = str1;
Console.WriteLine(str2);
str1.Remove(0,str1.Length); //清除str1的所有字符串
Console.WriteLine(str1); //再次 輸入的時候就輸出為空了,str1,str2均為空
Console.WriteLine(str2);
Console.ReadLine();
}
}
}
我們會發現,當我們改變str1的值的時候,str2的值也已經改變,這是因為stringbuild 是一個完全的引用。當我們改變str1的值的時候,str2所指向的值也發生了改變。
|