理解C 的string型別

2021-06-10 02:42:08 字數 1487 閱讀 2785

有關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   

static

void main()

}

輸出的結果是 "123" 。

那麼,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資料型別是一種引用型別,但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。問題對於常見的引用型別,當改變乙個物件別名的值時,這種變化也同樣會...