標籤:style blog http color io ar 使用 for strong
C#是區分大小寫,但是我卻發現C#中同時存在String與string,於是我很困惑,於是我上網搜尋了一下,於是我瞭解了一些小知識。
MSDN中對string的說明:
string is an
alias for
String in the .NET Framework。string是String的別名而已,string是c#中的類,String是Framework的類,C# string 映射為 Framework的 String。如果用string,編譯器會把它編譯成String,所以如果直接用String就可以讓編譯器少做一點點工作。
如果使用C#,建議使用string,比較符合規範 。 string始終代表 System.String(1.x) 或 ::System.String(2.0) ,String只有在前面有using System;的時候並且當前命名空間中沒有名為String的類型(class、struct、delegate、enum)的時候才代表System.String。
string是關鍵字,String不是,也就是說string不能作為類、結構、枚舉、欄位、變數、方法、屬性的名稱,而String可以。
今天突然用到C#的string,突然想起來一直沒弄明白string和String有什麼區別,查了一下電子書、MSDN以及百度和Google,更進一步看看String的一些問題。
0. 問題: 1. C#到底是什麼時候傳引用?什麼時候傳值? 2. String傳值還是傳引用 3. string和String有什麼區別? 4. String為什麼是Immutable,怎麼實現的? 以下查詢結果以及我的理解:
1. C#到底是什麼時候傳引用?什麼時候傳值? 傳值的情況 :Struct、Enumeration、Numeric(Integral/Floating/decimal)、bool 傳引用的情況:class、Delegate、Interface 當使用操作符"="以及函數傳參數的時候: 傳值的結果是把原對象複製了一份,接收者指向原對象。 傳引用的結果是直接讓接收者指向原對象。 有人說,我硬要把值當引用傳怎麼辦?a、用ref關鍵字b、用數組,數組是classc、涼拌:)
2. String傳值還是傳引用 C#的String聲明是class String,當然是傳引用。不過,之所以有這個疑惑,多數是因為這個情況:string a = "aaa";string b = a;b = "bbb";或者是這麼幾行代碼:public void Swap(string s1, string s2){ string temp=s1; s1=s2; s2=temp;}這時候結果一列印,結果發現a的值還沒有變,Swap也沒有成功,這時候就會有幻覺:是不是沒有傳引用啊?呵呵,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
3. string和String有什麼區別?MSDN中對string的說明:
string is an
alias for
String in the .NET Framework呵呵string是String的別名而已,都是一家。
4. String為什麼是Immutable,怎麼實現的? immutable:對象一旦產生不可改變關於怎麼實現的,在明白了問題2之後很好辦,只要不提供任何修改自己成員變數的方法就可以了。順便聲明為sealed,防止不清楚的後來者違反規定:)String每個看似修改了成員變數的方法,事實上都返回了一個新的String。比如String.Replace函數,事實上並沒有改變原來的串,這也是為什麼只有讓
str = str.Replace( foo, bar)才真正完成替換的原因。
轉 C#String與string的區別