日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

String到底是值类型还是引用类型(C#)

發布時間:2023/12/18 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 String到底是值类型还是引用类型(C#) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MSDN 中明確指出 String 是引用類型而不是值類型,但 String 表面上用起來卻像是值類型,這又是什么原因呢??
首先從下面這個例子入手:

//值類型int a = 1;int b = a;a = 2;Console.WriteLine("a is {0},b is {1}", a, b);//引用類型string str1 = "ab";string str2 = str1;str1 = "abc";Console.WriteLine("str1 is {0},str2 is {1}", str1, str2);Console.Read();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

輸出結果:

//結果://a is 2,b is 1//str1 is abc,str2 is ab
  • 1
  • 2
  • 3

從運行結果可以看出:str2 的值還是 ab ,并沒有隨著 str1 值的改變而改變。如果string是引用類型,按理Str1和Str指針都指向同一內存地址,如果Str的內容發生改變,Str1應該也會相應變化。此例子,看著string更像是值類型。 但是MSDN卻說String是引用類型。究其原因,是因為string對象是不可變的,包括長度和其中任何字符都是不可以改變的。

String的不變性

string 對象稱為不可變的(只讀),因為一旦創建了該對象,就不能修改該對象的值。有的時候看來似乎修改了,實際是string經過了特殊處理,每次改變值時都會建立一個新的string對象,變量會指向這個新的對象,而原來的還是指向原來的對象,所以不會改變。這也是string效率低下的原因。如果經常改變string的值則應該使用StringBuilder而不使用string。

在例子中str1=”ab”,這時在內存中就將“ab”存下來,如果再創建字符串對象,其值也等于“ab”,str2=”ab”,則并非再重新分配內存空間,而是將之前保存的“ab”的地址賦給str2的引用,這就能印證例子2中的結果。而當str1=”abc”其值發生改變時,這時檢查內存,發現不存在此字符串,則重新分配內存空間,存儲“abc”,并將其地址賦給str1,而str2依然指向“ab”的地址。可以印證例子中的結果。

結論

String是引用類型,只是編譯器對其做了特殊處理。

總結

以上是生活随笔為你收集整理的String到底是值类型还是引用类型(C#)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。