有關c# string型別究竟是值型別還是引用型別,在很多c#學習者中都或多或少造成過困惑,多數是因為這個情況:
string a = "aaa";
string b = a;
b = "bbb";
或者是這麼幾行**:
public void swap(string s1, string s2)
string temp=s1;
s1=s2;
s2=temp;
這時候結果一列印,結果發現a的值還沒有變,swap也沒有成功,這時候就會有幻覺:是不是沒有傳引用啊? 呵呵,c#的string宣告的是class string,當然是傳引用,不會這麼粗暴的打亂「宣告為class就是傳引用」這種規則的。
分析一下:
string a = "aaa"; //==> a----->new string("aaa")
string b = a; //==> b----->a, 傳引用
b = "bbb"; //==> b----->new string("bbb"), 傳引用,b指向了乙個新的字串,a並沒有變。
swap函式也是這樣,比如說傳了a, b進去(a="aaa", b="bbb"), //s1----->a, s2----->b
string temp=s1;//temp----->s1----->a
s1=s2; //s1----->s2----->b;
s2=temp; //s2----->temp----->a 結果是,s1和s2確實是swap了,但是這種結果並不會影響到a和b
又好比下面這個例子:
class class1輸出的結果是 "123" 。static
void main()
}
那麼,string 到底是值型別還是引用型別?有人會說,如果是值型別,結果倒還說的過去.但是string 的定義不是應該是引用型別麼?如果是引用型別的話.輸出的結果難度不應該是: "hellow"麼?
解答這個問題的關鍵在於,c# string型別是特殊的引用型別,它的例項是唯讀的。這個地方要搞清楚語法和實現的區別 。在c#的語法中,
◆static void strchange(string str) 是值傳遞
◆static void strchange(ref string str) 是引用傳遞
但在實現上,static void strchange(string str) 這種值傳遞,在函式體內對str進行修改之前,與函式外部的變數指向同一塊記憶體,是「引用」傳遞,但在函式體內對str修改後,就會觸發對該str重新分配一塊記憶體。
所以說,string 是引用型別,不過是不可變的。對字串做一些操作(比如大小寫的轉換、+=), 實際上是重新建立了乙個字串。這也是為什麼在做大量字串拼接的時候要使用stringbuilder 而不用+=。
理解C 中的string型別
本文的目的在於揭示和dotnet及c 相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string資料型別有關,string資料型別是一種引用型別,但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。問題對於常見的引用型別,當改變乙個物件別名的值時,這種變化也同樣會在...
理解C 中的string型別
目的 本文的目的在於揭示和dotnet及c 相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string 資料型別有關,string 資料型別是一種引用型別 但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。問題 對於常見的引用型別 當改變乙個物件別名的值時,這種變...
理解C 中的string型別
目的 本文的目的在於揭示和dot 及c 相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string資料型別有關,string資料型別是一種引用型別,但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。問題對於常見的引用型別,當改變乙個物件別名的值時,這種變化也同樣會...