今天上班的時候看到了幾行C#代碼,其中一行用的是string,另一個用的是String;大家都知道string是C#中System.String的別名,一般情況下二者具有相同的含義和功能,那問題時二者是完全相同沒有任何區別的嗎?如果答案是“是”的話,微軟為什么實現了這兩個概念而不是僅僅用sting或者String呢,畢竟用一個的話跟簡單,給開發人員帶來的困惑也更少。
這個問題純粹是概念上和理解上的問題,對您的編程技巧沒有實質的幫助,如果沒有興趣的話你看到這里就可以為止了;如果您是技術大牛,完全明白這二者的含義,您可以忽略本文也可以幫我指正錯誤。
好了,既然您繼續向下看,那我也就繼續說了哦J.
為了使本文描述更准確(其實是擔心自己理解不全面,誤導了繼續看的dev們),我特地google了一下,下面的分析中很多是參考了搜索結果的內容,甚至是照搬了部分代碼,當然我也會在相應的位置上注明引用的URL地址。
不廢話了,直接上代碼開始分析(請注意下面代碼的顏色,這是我用插入代碼的方式自動生成的)。
1 string s = “Hello, World.”; 2 String S = “Hello, World.”;
在含義上相當於是using string = System.String,你可以使用typeof(string) == typeof(System.String)來判斷;從技術上來講二者沒有什么區別,正如int和Int32一樣。很多編程指導原則中推薦這樣的一種使用方法:當你使用對象時用string,當作類時用String,例如string s = String.Format(“Hello, {0}.”, “World”),這是微軟在示例String.Format方法時的用法;而StyleCop現在強制使用C#規范的別名,也就是說使用StyleCop的話它會強制你使用string而不是String。
類似的C#別名還有:
C#別名 |
BCL全稱 |
object |
System.Object |
string |
System.String |
bool |
System.Boolean |
byte |
System.Byte |
sbyte |
System.SByte |
short |
System.Int16 |
ushort |
System.UInt16 |
int |
System.Int32 |
uint |
System.UInt32 |
long |
System.Int64 |
ulong |
System.UInt64 |
float |
System.Single |
double |
System.Double |
decimal |
System.Decimal |
char |
System.Char |
和string、object不同,其他的別名都是值類型的,其中decimal是值類型但不是CLR的基礎類型(primitive type)。CLR中唯一沒有別名的基礎類型是System.IntPtr。
有一種情況是必須使用別名而不能使用CLR全名:
1 public enum Foo:Int32{} //編譯錯誤 2 3 public enum Bar:int{} //編譯正確
還有一種情況:string是C#保留的關鍵字,而String是類名(不是保留關鍵字),也就是說如果你把String用作變量名是不會有編譯錯誤的,而用string作變量名就會有編譯錯誤。
1 StringBuilder String = new StringBuilder(); //編譯正確 2 3 StringBuilder string = new StringBuilder();//編譯錯誤
當然了,如果你非要用string作變量名的話請在string前加上@,即StringBuilder @string = new StringBuilder()這句話是編譯能通過的。
還有一種情況:在反射中你只能使用String而不能使用string。
還有一種情況:在未使用using System情況下,你不能使用String而只能使用string。
最后一種情況:string是C#的保留字,而String是CLR的類型,如果其他廠商實現一種運行時來支持C#的話(恰好有沒有支持String),結果就可想而知了。當然了這種情況基本上是不存在的,比彗星撞地球都幾率小。
以上是對string和String區分的一個小總結,如果有遺漏或不正確的地方,歡迎指正。